Fre*_*lam 30 parameters methods scala variadic-functions
这是我可以在java中做的事情,获取重复参数的结果并将其传递给另一个方法:
public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
Run Code Online (Sandbox Code Playgroud)
在scala中它看起来像这样:
def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
Run Code Online (Sandbox Code Playgroud)
但这不会编译,bar签名需要一系列单独的字符串,而传入的args是一些非字符串结构.
现在我只是绕过阵列.使用星号参数会非常好.有办法吗?
ret*_*nym 48
Java假设您希望自动将Array转换args为varargs,但这对于接受Object类型的varargs的方法可能会有问题.
Scala要求您明确,通过将参数归为: _*.
scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit
scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit
scala> foo("1", "2")
count=2
Run Code Online (Sandbox Code Playgroud)
您可以使用: _*在任何亚型Seq,或任何隐含可转化到Seq,尤其是Array.
scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int
scala> foo(1, 2, 3)
res0: Int = 3
scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3
scala> foo(List(1, 2, 3): _*)
res2: Int = 3
scala> foo(Array(1, 2, 3): _*)
res3: Int = 3
scala> import collection.JavaConversions._
import collection.JavaConversions._
scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3
Run Code Online (Sandbox Code Playgroud)
" 语言参考"的 4.6.2节中的示例对此进行了解释.
请注意,这些示例是使用Scala 2.8.0.RC2制作的.