2009-12-16 37 views
5

Jestem pewien, że odpowiedź jest dość prosta, ale utknąłem w tym:puzzle varargs?

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

Jak zbudować „Int *”?

Odpowiedz

10

Aby rozpakować sekwencję na liście argumentów, użyj _*

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

tak! to działa! ... czuje się trochę jak "zmuszanie" tego typu, ale – GClaramunt

+2

Cóż, to wymusza typ. Poprawny typ to lista argumentów, a nie argument, który jest listą. Nawiasem mówiąc, działa on dla dowolnego typu sekwencji, jak również dowolnego typu, który można przekształcić w sekwencję, więc mógłbyś przekazać bezpośrednio "List". Ponadto jest symetryczny. Możesz zrobić "xs match {case List (ys @ _ *) => ...}". –