6

说我有一个功能

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):_*不要键入检查。

更何况没有 foos怎么称呼呢?

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

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

谢谢!

4

2 回答 2

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
于 2012-11-22T17:57:12.477 回答
7

鉴于 Paolo 提到的 Scala 2.9 限制,您仍然可以使用 currying 将参数划分为不同的部分,一个使用带有默认参数的命名参数,一个用于可变参数(如果您需要多个可变参数,则可以使用多个 curried 参数部分) . 关于可读性,结果几乎比仅使用命名参数更好:

f(b="something")()
f(c=3.14)(foo1, foo2)
于 2012-11-23T09:34:51.440 回答