1

本 Scala in Depth で。次のような暗黙のスコープの例があります。

scala> object Foo {
     | trait Bar
     | implicit def newBar = new Bar {
     |   override def toString = "Implicit Bar"
     | }
     | }
defined module Foo

scala> implicitly[Foo.Bar]
res0: Foo.Bar = Implicit Bar

ここでの私の質問は、上記の例でトレイト Bar の実装をどのように暗黙のうちに見つけたのですか? 暗黙的にどのように機能するかについて少し混乱していると思います

4

1 に答える 1

3

どうやら、Foo.Barの場合、Foo#Barのように機能します。つまり、if T is a type projection S#U, the parts of S as well as T itself暗黙のスコープ内にあります(仕様の7.2ですが、すでに参照しているなど、暗黙のスコープに関する通常のリソースを参照してください)。(更新:ここにそのようなリソースがあります。これは、このケースを正確に示しておらず、実際の例が人工的に見えるかどうかを示していません。)

object Foo {
  trait Bar
  implicit def newBar = new Bar {
    override def toString = "Implicit Bar"
  }
}

class Foo2 {
  trait Bar
  def newBar = new Bar {
    override def toString = "Implicit Bar"
  }
}
object Foo2 {
  val f = new Foo2
  implicit val g = f.newBar
}

object Test extends App {
  // expressing it this way makes it clearer
  type B = Foo.type#Bar
  //type B = Foo.Bar
  type B = Foo2#Bar
  def m(implicit b: B) = 1
  println(implicitly[B])
  println(m)
}
于 2012-12-08T03:58:06.230 に答える