5

次のコードを検討してください。

class A { def print = println("A") }
class B extends A { override def print = println("B") }

def foo(implicit a: A) = a.print

def bar(implicit a: A) = {
  implicit val b = new B
  foo
}

bar(new A) // B

なぜ電話をかけfooてもエラーが発生しbarないのか疑問に思いambiguous implicit valuesます。もちろん

implicit val b: A = new B

そのエラーが発生します。暗黙的ではなくfoo暗黙的を選択するのはなぜですか?またはさらに一般的:何が選ばれるのかというルールは何ですか?ba

編集:
Ivanとのコメント会話のため、明確にしたい:暗黙のメソッドパラメータと同じ方法でローカルの暗黙のvalに名前を付ければ、私の質問に対する答えがわかります。

def bar(implicit a: A) = {
  implicit val a = new B
  foo
}

次に、ローカルのみがval aスコープ内にあり、同じ名前であるため、メソッドパラメーターをスコープオーバーライドします。

4

1 に答える 1

1

注: かなり単純化しすぎている可能性がありますが、テストでは次のように見えました。

2枚目はスコープ内なので優先されるからです。で起こるのと同じことです

object test {
 val a = 5
 def test(i: Int) = {
   val a  = 6
   i + a
 }
}

この場合a、関数内で 6 になることが予想されます。以下も同様です。

object test {
  implicit val i = 5; 
  { 
    implicit val b = 6; 
    test
  } 
  def test(implicit ii:Int) = println(ii)
} 

コメントから更新。

scala> def test(a: Int) = {val a = 5; a }
test: (a: Int)Int

scala> test(6)
res1: Int = 5
于 2012-11-23T09:59:45.100 に答える