6

我知道可以将单个参数传递给 vararg 函数,并且可以使用 seq 传递,:_*但是可以同时传递两者吗?

例如:

scala> object X { def y(s: String*) = println(s) }
defined module X

scala> X.y("a", "b", "c")
WrappedArray(a, b, c)

scala> X.y(Seq("a", "b", "c"):_*)
List(a, b, c)

scala> X.y("a", Seq("b", "c"):_*)
<console>:9: error: no `: _*' annotation allowed here
(such annotations are only allowed in arguments to *-parameters)
       X.y("a", Seq("b", "c"):_*)
                             ^

编辑:在 Scala 2.10 中(以防万一)

4

2 回答 2

5

哈基,但这应该很好用:

X.y(Seq("a") ++ Seq("b", "c"):_*)
于 2013-03-19T15:01:01.010 回答
3

如果你在 Scala 标准库中环顾四周,你会在一些地方发现这种模式:

def doIt(arg: Thing)
def doIt(arg1: Thing, arg2: Thing, moreArgs: Thing*)

您可以看到这一点,例如,在Set.+(...). 它允许您在重载中使用任意数量的参数而不会产生歧义。

附录

概念证明:

scala> class DI { def doIt(i: Int) = 1; def doIt(i1: Int, i2: Int, iMore: Int*) = 2 + iMore.length }
defined class DI

scala> val di1 = new DI
di1: DI = DI@16ac0be1

scala> di1.doIt(0)
res1: Int = 1

scala> di1.doIt(1, 2)
res2: Int = 2

scala> di1.doIt(1, 2, 3)
res3: Int = 3

scala> di1.doIt(1, 2, List(3, 4, 5): _*)
res4: Int = 5
于 2013-03-19T15:22:12.740 回答