说我有一个功能
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()
)调用该函数不起作用。
谢谢!
答案 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)