私は暗黙のパラメータを使用して、次のように依存関係をクラスに「注入」しようとしています。
trait Bar {
def m:String
}
object Bar {
implicit val objBar = new Bar{ val m = "from object" }
}
trait FooTrait {
def aBar(implicit bar:Bar) = bar
def go = { aBar.m }
}
ここで、コンパイラは、コンパニオンオブジェクトの暗黙のFooTrait
valからに暗黙の引数を提供します。Bar
そうすること:
scala> println((new FooTrait{}).go)
from object
期待する結果が得られます。ただし、FooTraitと次のような別の特性を組み合わせると次のようになります。
trait SuperFoo {
implicit val superBar = new Bar{ val m = "from super" }
}
結果は同じです:
scala> println((new FooTrait with SuperFoo).go)
from object
コンパイラは、のコンパニオンオブジェクトSuperFoo
をチェックして暗黙の引数を解決しようとする前に、前を調べると思いました。Bar
このブログ投稿は次のように述べています。
暗黙の値が暗黙のパラメーターに適用される非常に厳密な規則があります。それについて考える簡単な方法は、「最も近い」定義が使用されるということです。ローカルスコープ、包含クラス、親クラス、目的のタイプのコンパニオンオブジェクト。
私は何かが足りないのですか、それともこれはscalasの暗黙のパラメーターの既知の制限ですか?