6

関数があるとします

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

一部のパラメータでデフォルト引数が使用されていることに注意してください。通常、デフォルト値を使用するには、次のように名前付きパラメーターを使用して関数を呼び出します。

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

この構文は、メソッドを 1 つだけ呼び出してfooいるため機能します。ただし、2つ以上ある場合

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

ここで何を供給すべきかはそれほど明白ではありません。Seq(foo1,foo2)チェックをSeq(foo1,foo2):_*入力しないでください。

さらに、どうすればsなし fooで呼び出すことができますか?

// 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 の制限を考えると、カリー化を使用してパラメーターを異なるセクションに分割することができます。1 つはデフォルト引数で名前付きパラメーターを使用し、もう 1 つは varargs (または、複数の vararg パラメーターが必要な場合は複数のカリー化された引数セクション) です。 . 読みやすさに関しては、結果は名前付き引数のみを使用するよりもほとんど優れています。

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