使用可变参数但使用命名参数调用函数的Scala语法是什么?

时间:2012-11-22 16:53:49

标签: scala variadic-functions keyword-argument

说我有一个功能

def f(a:Int = 0, b:String = "", c:Float=0.0, foos: Foo*) { ... }

请注意某些参数使用默认参数。通常,要使用默认值,可以调用具有命名参数的函数,如:

val foo = Foo("Foo!")
f(foos = foo)

此语法有效,因为我只使用一个foo 调用该方法。但是,如果我有两个或更多

val foo1 = Foo("Foo!")
val foo2 = Foo("Bar!")
f(foos = ...)

在这里应该喂什么不是那么明显。 Seq(foo1,foo2)Seq(foo1,foo2):_*不会输入支票。

更重要的是,如何使用 foo来调用它?

// All out of foos!
f(foos = ...)

对于这种情况,使用空括号(f())调用该函数不起作用。

谢谢!

2 个答案:

答案 0 :(得分:8)

有关默认参数,请参阅我对您问题的评论。有关如何使用命名参数调用可变参数部分,请参见下文(scala 2.9.2):

scala> case class Foo(a:Int)
defined class Foo

scala> def f(a:Int, foos: Foo*) = foos.length
f: (a: Int, foos: Foo*)Int

scala> f(a=2, foos=Foo(2))
res0: Int = 1

// I'm not sure if this is cheating...
// am I just naming the first of the two variadic arguments?
scala> f(a=2, foos=Foo(2),Foo(3))
res1: Int = 2

//anyway you can do ....
scala> f(a=2, foos=Seq(Foo(1), Foo(2)):_*)
res2: Int = 2

// with no foos...
scala> f(a=2, foos=Nil:_*)
res3: Int = 0

答案 1 :(得分:7)

考虑到Paolo提到的Scala 2.9限制,你仍然可以使用currying来划分不同部分的参数,一个使用带有默认参数的命名参数,另一个用于varargs(如果你想要多个参数,可以使用多个curried参数部分) vararg参数)。关于可读性,结果几乎比仅使用命名参数更好:

f(b="something")()
f(c=3.14)(foo1, foo2)