2012-02-23 11 views
11

と連動して、デフォルトの引数は次のことを考えてみましょう:Scalaは名前が付けられ、暗黙のパラメータ

def f(implicit a: String, y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

最後の式は、次のエラーが発生:あなたは暗黙的にデフォルト値を提供する場合、しかし、

not enough arguments for method f: (implicit a: String, implicit y: 
Int)java.lang.String. Unspecified value parameter a. 

をパラメータa、問題はありません:

def f(implicit a: String = "haha!", y: Int = 0) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

最終行私は

size: 2 

を期待しているだろうが

haha!: 2 

よだから、暗黙の値 's' はピックアップされていません。あなたの代わりにFまでの任意のパラメータを提供しないし、ちょうど

println(f) 

を呼び出す場合は、暗黙の値をピックアップし、あなたが

size: 0 

を取得している誰かがここで何が起こっているのかについていくつかの光を当てることができますか?

答えて

15

あなたはパラメータを指定して起動したら、あなたが戻って行くことができない

println(f(y = 2, a = implicitly)) 

を試してみてください。リスト全体が暗黙的であるか、それともどれも暗黙のものではありません。あなたは

def f(a: String = implicitly, y:Int = 0) = a + ": " + y 

それとも私が見にもっと慣れている方法のように、あなたの関数を定義することができjsuerethが言ったの線に沿って

0

def f(y:Int = 0)(implicit a: String) = a + ": " + y 
+2

あなたが暗黙的に使用している暗黙のどの範囲を確認する必要があります。私はそれが第二の選択肢と同じだとは思わない。 – jsuereth

4

暗黙のパラメータは、個別に行く必要があります - - 最初、メソッド定義の最後に - 秒。このように:

def f(y: Int = 0)(implicit a: String) = a + ": " + y 
implicit val s = "size" 
println(f(y = 2)) 

Ouputs

size: 2 
+0

最初のデフォルトパラメータを使用するには 'f()'を呼び出さなければなりません。 – raisercostin

関連する問題