2009-12-16 34 views
5

estoy seguro de que la respuesta es bastante simple, pero me quedé atrapado en este:varargs rompecabezas?

Welcome to Scala version 2.7.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_14). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def f(x:Int*)=0 
f: (Int*)Int 

scala> val xs:Seq[Int]=1::2::3::4::Nil 
xs: Seq[Int] = List(1, 2, 3, 4) 

scala> f (xs) 
<console>:7: error: type mismatch; 
found : Seq[Int] 
required: Int 
     f (xs) 
     ^

Cómo construir un 'int *'?

Respuesta

10

Para descomprimir una secuencia en la lista de argumentos, utilice _*

scala> f(xs: _*) 
res1: Int = 0 
+0

sí! ¡eso funciona! ... se siente un poco como "forzar" el tipo, aunque – GClaramunt

+2

Bueno, está forzando el tipo. El tipo correcto es una lista de argumentos, no un argumento que es una lista. Por cierto, funciona para cualquier tipo de secuencia, así como para cualquier tipo que se pueda convertir en una secuencia, por lo que podría haber pasado 'List' directamente. Además, es simétrico. Podría hacer 'xs match {case List (ys @ _ *) => ...}'. –