2009-12-16 4 views
5

Je suis sûr que la réponse est assez simple, mais je me suis coincé dans ce:Varargs puzzle?

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) 
     ^

Comment je construis un « Int * »?

Répondre

10

Pour déballer une séquence dans la liste des arguments, utilisez _*

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

oui! ça marche! ... se sent un peu comme "forcer" le type, mais – GClaramunt

+2

Eh bien, c'est forcer le type. Le type correct est une liste d'arguments, pas un argument qui est une liste. D'ailleurs, cela fonctionne pour n'importe quel type de séquence, ainsi que tout type qui peut être converti en une séquence, donc vous pourriez avoir passé 'List' directement. En outre, il est symétrique. Vous pouvez faire 'xs match {case List (ys @ _ *) => ...}'. –