次のコードをコンパイルします
def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)
しかし、コンパイラは引数の数についてうめきます。暗黙的としてマークされたパラメーターのみがあった場合に上記が機能するのはなぜx
ですか?この例では機能しません。
次のコードをコンパイルします
def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)
しかし、コンパイラは引数の数についてうめきます。暗黙的としてマークされたパラメーターのみがあった場合に上記が機能するのはなぜx
ですか?この例では機能しません。
暗黙の引数は、独自の括弧で区切られている必要があります。
scala> def foo(x2: Int)(implicit x: Int) = println(x2 + x)
scala> implicit val x: Int 2
scala> foo(1)
3
非暗黙の引数と暗黙の引数を同じ括弧に入れる場合は、両方の引数を明示的に渡す必要があります。そうしないと、コンパイラーは引数の数が間違っていると文句を言います。Scala コンパイラは、引数が暗黙的としてマークされていて、引数が明示的に渡されていないことを確認すると、暗黙的な引数を探しようとします。ただし、コンパイラは、暗黙的なものをチェックする前に、正しい数の引数が渡されたかどうかをチェックします。
暗黙のパラメータはオールオアナッシングです。それらすべてを明示的に渡すか、またはそれらのいずれも渡さず、コンパイラーがすべてに対して暗黙を選択します。
この例では、パラメータをに渡す必要があるfoo
ため、すべてを渡す必要があります。にパラメータが1つしかない場合はfoo
、パラメータの数が正しいために機能します(そして、パラメータは明示的に渡されます)。foo
パラメータを渡さずに呼び出す場合はimplicit val x
、両方のパラメータを選択するため、これも機能します。
これはあなたが望むように動作します:
def foo(x2: Int)(implicit x: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)
私は Scala の内部と仕様にあまり詳しくないので、これがなぜなのかを詳しく説明することはできませんが、括弧を追加して暗黙を渡す必要があります。
編集:興味があったので、インターウェブを見回しました。自分で見つけたすべてのものを再入力するわけではないので、ここでより詳細な情報を見つけることができます: http://daily-scala.blogspot.de/2010/04/implicit-parameters.html