2015-10-28 10 views
9

は、オプションのパラメータで次の関数を考えます代入)は、次のいずれかの構文でよいでしょう:Scalaでオプションのパラメータをスキップする方法は?私は<em></em>のデフォルト値を保つだけの位置割り当てによって(というよりも名前のことで<em>B</em>とC</em><em>に新しい値を渡したい</p> <pre><code>def foo(a:Int = 1, b:Int = 2, c:Int = 3) ... </code></pre> <p>:

foo(, 5, 7) 
foo(_, 5, 7) 

Scalaで可能なことはありますか?

+1

なぜパラメータにラベルを付けませんか? –

+0

これは他の言語でも可能ですか? Python、R、Javaのように? –

+0

@Tripp:すべての単一の関数呼び出しですべてのパラメータ名(たぶん長い名前)を繰り返しても迷惑です。私は怠惰だ:)さらに、私は議論を残しておくことは非常に明確で明確であり、言語仕様に実装するのも簡単だと思う。 –

答えて

10

は、パラメータをスキップする方法はありませんが、あなたがたとえば、あなたのfooメソッドを呼び出すときに、名前付きパラメータを使用することができます。

// Call foo with b = 5, c = 7 and the default value for a 
foo(b = 5, c = 7) 

編集 - あなたは、位置割り当てによってこれを行う方法を具体的に尋ねました:これはScalaでは不可能です。

4

パラメータの1つを適用して、別の関数を作成することができます。

def long(a: Int = 1, b: Int = 2, c: Int = 3) = a + b + c 

def short(x: Int, y: Int) = long(b = x, c = y) 

val s = short(10, 20) // s: Int = 31 
1

Currying

あなたはメソッドのシグネチャを少し変更する必要があります可能性があり(これまでかなりの)解決策:

def foo(a: Int = 1)(b: Int = 2)(c: Int = 3) = a + b + c 

foo()()(3) // 6 
foo()(2)(3) // 6 
foo(2)()(3) // 7 
foo(3)()(3) // 8 
:すべてのパラメータについて

// Just for "a" parameter 

def foo(a: Int = 1)(b: Int = 2, c: Int = 3) 

foo()(2,3) // 6 
foo(1)(2,3) // 6 
foo(2)(2,3) // 7 

+0

'foo.curried'を使ってfooをメソッドのシグネチャを変更せずにカレット化したフォームに変換することもできます。 –

関連する問題

 関連する問題