2010-07-13 2 views
6

(2.7) :스칼라에서 반복 인수를 전달하려면 어떻게해야합니까? 나는이 기능이있는 경우 스칼라에서

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

를 지금 다음과 같은 정의하려고하면 :

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

다음 컴파일러는 불평 :

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

I을 Programming Scala 책에 함수 bar 안에있는 args의 유형이 실제로임을 나타내므로이 오류를 이해할 수 없습니다. 반복되는 인수로 래퍼 함수를 ​​어떻게 작성해야합니까?

+7

경우 [푸]는 잘못; 보통 번역은 Seq [Foo] –

답변

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 

당신은 스칼라에서 가변 인자가 Seq하지 Array로 구현되기 때문에 변환 이상 수행해야합니다.

다음

어떻게 가변 인자는 보통 스칼라에 전달되어 책이 실제로 배열에 푸 *을 동일시

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

입니다. 처음으로 문제가 완전히 누락되었습니다. 감사합니다 S.O. 정답을 띄우기 위해서! –

관련 문제