2012-11-22 6 views
6

は私が機能可変引数を持つ関数を名前付き引数で呼び出すためのScala構文は何ですか?

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

お知らせいくつかのパラメータのデフォルト引数の使用を持っていると言います。一般的に、デフォルト値を利用するために、あなたはそうのような名前のパラメータを持つ関数を呼び出す:私は一つだけfooでメソッドを呼び出していので

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

この構文は動作します。しかし、私が2つ以上ある場合は、どのようなものを食べさせるべきかは分かりません。 Seq(foo1,foo2)およびSeq(foo1,foo2):_*は、チェックを入力しません。

fooで電話をするにはどうすればいいですか?この場合の

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

、空の括弧(f())で関数を呼び出すことは動作しません。

ありがとうございます!

+0

あなたはどのスカラーですか? 2.9.2でREPLでfを定義しようとすると、私に ":9:error:' * 'パラメータのあるパラメータセクションにデフォルトの引数が与えられない " –

+0

私は2.9.2でこれを見ているよくしかし、コンパイルしている実際のコードは2.9.1で動作しています。 – fatuhoku

答えて

7

、あなたはまだ別のセクションでパラメータを分割するためにカリー化を使用することができ、デフォルトの引数で名前付きパラメータを使用するものと、varargs(または複数のvarargパラメータが必要な場合は複数のカルト引数セクション)です。読みやすくするためには、名前付き引数だけを使用するよりも、結果はより良くなります。

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

これは実際にはかなり良いアイデアです、ありがとう! – fatuhoku

+0

私は同意する、それは良いよ! –

8

デフォルトのパラメータについては、あなたの質問に私のコメントを参照してください。名前付き引数と可変長部分を呼び出す方法を、下記(スカラ座2.9.2)を参照してください:

パオロが言及したことはScala 2.9の限界を考えると
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 
+0

ありがとうございます、それはかなり明確です。私はあなたの答えを受け入れるつもりです。なぜなら、それはより密接に問題に対応しているからです。実践的には、ブルーノート10のアプローチを採用すると思います。 – fatuhoku

+0

@fatu私の答えは[技術的には正しい]ことを知っています(www.deadprogrammer.com/technically-correct/)...私はまた、ブルーノート10のアプローチがより良く、より有用な正しいブランドであると考えています。あなたはまだ鉱山を受け入れて彼の答えを受け入れることができます。 –

+0

ハハ、大丈夫です。 – fatuhoku

関連する問題