1

次のコードをコンパイルします

def foo(implicit x: Int, x2: Int) = println(x2 + x)
implicit val x : Int = 2
foo(1)

しかし、コンパイラは引数の数についてうめきます。暗黙的としてマークされたパラメーターのみがあった場合に上記が機能するのはなぜxですか?この例では機能しません。

4

3 に答える 3

4

暗黙の引数は、独自の括弧で区切られている必要があります。

scala> def foo(x2: Int)(implicit x: Int) = println(x2 + x)
scala> implicit val x: Int 2
scala> foo(1)
3

非暗黙の引数と暗黙の引数を同じ括弧に入れる場合は、両方の引数を明示的に渡す必要があります。そうしないと、コンパイラーは引数の数が間違っていると文句を言います。Scala コンパイラは、引数が暗黙的としてマークされていて、引数が明示的に渡されていないことを確認すると、暗黙的な引数を探しようとします。ただし、コンパイラは、暗黙的なものをチェックする前に、正しい数の引数が渡されたかどうかをチェックします。

于 2012-08-17T14:50:17.923 に答える
2

暗黙のパラメータはオールオアナッシングです。それらすべてを明示的に渡すか、またはそれらのいずれも渡さず、コンパイラーがすべてに対して暗黙を選択します。

この例では、パラメータをに渡す必要があるfooため、すべてを渡す必要があります。にパラメータが1つしかない場合はfoo、パラメータの数が正しいために機能します(そして、パラメータは明示的に渡されます)。fooパラメータを渡さずに呼び出す場合はimplicit val x、両方のパラメータを選択するため、これも機能します。

于 2012-08-17T14:02:39.523 に答える
2

これはあなたが望むように動作します:

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

于 2012-08-17T13:24:55.457 に答える