2010-07-13 7 views
6

(2.7),:Scala'da tekrarlanan bağımsız değişkenleri nasıl iletirim? Ben bu fonksiyonu varsa Scala yılında

def foo(args: Array[String]) = 
    for (arg <- args) println(arg) 

Ben şimdi aşağıdaki tanımlamaya çalışırsanız:

def bar(args: String*) = foo(args) 

sonra derleyici yakınır:

<console>:5: error: type mismatch; 
found : String* 
required: Array[String] 
     def bar(args: String*) = foo(args) 
           ^

I Programlama Scala kitabının, bar işlevinin içindeki args türünün aslındaolduğunu bildirmesi nedeniyle bu hatayı anlama. Tekrarlanan argümanlar ile böyle bir sarıcı işlevi nasıl yazmalıyım?

+7

Eğer [Foo] bunun yanlış; her zamanki çeviri: Seq [Foo] –

cevap

18
scala> def foo(args: Array[String]) = for(arg <- args) println(arg) 
foo: (args: Array[String])Unit 

scala> def bar(args: String*) = foo(args.toArray) 
bar: (args: String*)Unit 

scala> bar("hello", "world") 
hello 
world 

Sen Scala varargs Seq değil Array olarak uygulanmaktadır nedeniyle dönüşüm yukarıdaki gerçekleştirmeniz gerekir.

İşte

nasıl varargs genellikle Scala iletilir edilir: Kitap aslında Dizisine Foo * eşittir

scala> def fooV(args: String*) = args foreach println 
fooV: (args: String*)Unit 

scala> def fooS(args: Seq[String]) = fooV(args: _*) 
fooS: (args: Seq[String])Unit 

scala> def bar(args: String*) = fooV(args: _*) 
bar: (args: String*)Unit 

scala> def barS(args: Seq[String]) = args foreach println 
barS: (args: Seq[String])Unit 

scala> def barV(args: String*) = barS(args) 
barV: (args: String*)Unit 

scala> def barV(args: String*) = barS(args.toSeq) 
barV: (args: String*)Unit 
+1

Problemi ilk kez tamamen özledim. Teşekkürler S.O. Doğru cevaplar yapmak için yüzer! –

İlgili konular