2013-08-20 25 views
6

Ben bir parametre olarak bir varargs kabul eden bir sınıf yazdım ve bir kullanıcı sık sık bir parametre belirtmeden örnek oluşturabilirsiniz böylece onun varsayılan belirtin:Scala varargs parametresinin varsayılan değerini neden belirtmek imkansız?

class MyClass(values: Int* = 42) { } 

Ancak derleyici ve REPL bana şu hataları vermek :

çözüm olarak
<console>:7: error: type mismatch; 
found : Int(42) 
required: Int* 
     class MyClass(values: Int* = 42) { } 
           ^
<console>:7: error: a parameter section with a `*'-parameter is not allowed to have default arguments 
     class MyClass(values: Int* = 42) { } 

, ben yapmak istedim, ama o da işe yaramadı: (. Açıkçası çok belirsiz)

class MyClass(value: Int = 42, otherValues: Int*) { } 

Neden bir varargs parametresi için varsayılan değere sahip olmak için izin verilmediğini merak ediyorum. Burada yatan akıl yürütme ya da teknik neden nedir? (Benim tahminim boş bir varargs belirtmek bazı özel sözdizimi veya deyim gerektirir, ancak bu yeterli bir neden olup olmadığından emin değilim.)

cevap

5

bu konuda biraz düşünme, ben, sadece çok fazla karmaşıklık ekleyerek değil meselesi olduğunu düşünüyorum Eğer

def f(a: A, xs: X* = Seq(x0, x1)) = ??? 

Şimdi Arayan böyle kullanır olduğunu varsayalım: f(a).

Arayanın, sıfır uzunluklu bir listeyi geçmesi veya sağlayarak varsayılan argümanları tetiklemek istediği nasıl bilinir? Örneğinizde, ikinci alternatifin, olması gereken tek durum olduğunu ve derleyicinin varsayılan argüman değerini sağlaması gerektiğini varsayıyorsunuz. Ancak boş bir Seq() zaten arayan tarafından sağlanan mükemmel geçerli bir değerdir. Arayanın f(a, Seq(): _*) yazabileceğini tahmin ediyorum ama hantal.

+0

Neden foo (sonuç: Int = 0, xs: String *) = ??? 'kabul edilebilir değil mi? Derleyicinin hukuki bir yapı olarak “0”, “derlemesi imkansız”) tanıması mükemmel bir şekilde mümkündür. –

+0

@ om-nom-nom, sizi takip ettiğimden emin değilim.Neden desteklemeyi istemediğimizi cevaplayalım foo (sonuç: Int = 0, xs: String * = Seq ("some", "default")) = ??? '. – huynhjl

+0

evet, ancak derleyici benim durumumdaki aynı kısıtlamayı koyar (en azından aynı derleme hatasını verir), bu yüzden bu iki durumu birleştiren başka bir sebep olabilir. –

3

Varargs, yalnızca Scala'da değil, bir argüman listesi üzerinde bir soyutlamadır Yanılmıyorsam, Seq, argümanların bir listesi haline getirildi. Bundan yola çıkarak, values: Int* = 42'dan ne sonuç beklersiniz? Ve sonra, bu yöntemi çağırdığınızda, bu yönteme nasıl argümanlar verilmelidir? scala şartname (Bölüm 4.6.2) Gönderen

+2

Ama en azından değer yapabilirsin: Int * = (Array (42): Int *) ' – Jatin

5

bir tekrarlanan parametre

bir parametre bölümünde herhangi varsayılan argümanlar Belki bir çözüm yardımcı olacağını fi ne de izin verilmez

?

class MyClass(values: Int*) { 
    def this() = this(5) 
} 
+1

Bunun neden böyle olduğunu açıklamıyor, sadece böyle bir reddetmeyi kabul ediyor. –

2

başka bir geçici çözüm Seq açık hale getirmektir: Birçok argümanlar iletilmesi gereken nasıl bilemiyorum çünkü

class MyClass(values: Seq[Int] = Seq(42)) { } 
+0

Evet, bittiğim geçici çözüm budur. – trustin

2

varargs A varsayılan değer sadece mantıklı değil. Bu bir scala sınırlaması değildir, bu mantıksal bir sınırlamadır.