在Scala(2.7)中,如果我有这个功能:
def foo(args: Array[String]) =
for (arg <- args) println(arg)
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试定义以下内容:
def bar(args: String*) = foo(args)
Run Code Online (Sandbox Code Playgroud)
然后编译器抱怨:
<console>:5: error: type mismatch;
found : String*
required: Array[String]
def bar(args: String*) = foo(args)
^
Run Code Online (Sandbox Code Playgroud)
我不明白这个错误,因为编程Scala书中指出args内部函数的类型bar实际上是Array[String].我怎么能用重复的参数写这样的包装函数?
mis*_*tor 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
Run Code Online (Sandbox Code Playgroud)
您需要执行上述转换,因为Scala中的varargs实现为Seq,而不是Array.
以下是通常在Scala中转发varargs的方法:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1172 次 |
| 最近记录: |