2010-07-13 35 views
6

Trong Scala (2.7), nếu tôi có chức năng này:Làm cách nào để chuyển tiếp các đối số lặp lại trong Scala?

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

Nếu bây giờ tôi cố gắng xác định như sau:

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

sau đó trình biên dịch phàn nàn:

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

tôi không hiểu lỗi này, kể từ khi cuốn sách Scala lập trình nói rằng các loại args bên trong chức năng bar thực sự là Array[String]. Làm thế nào tôi phải viết một hàm bao bọc như vậy với các đối số lặp đi lặp lại?

+7

Nếu cuốn sách thực sự tương đương với Foo * để Array [Foo] đó là sai; bản dịch thông thường là Seq [Foo] –

Trả lời

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 

Bạn cần phải thực hiện trên quy đổi vì giá varargs trong Scala được thực hiện như Seq, không Array.


Dưới đây là làm thế nào varargs thường được đưa ra trong Scala:

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

Tôi hoàn toàn bỏ lỡ vấn đề lần đầu tiên. Cảm ơn S.O. để làm cho câu trả lời đúng nổi lên! –

Các vấn đề liên quan