Как неявно работает в этом примере из Scala in Depth

В книге 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 в приведенном выше примере? Я думаю, что меня немного смущает то, как неявно работает


person sc_ray    schedule 08.12.2012    source источник
comment
Взгляните на stackoverflow.com/questions/3855595/scala-identifier-implicitly и посмотрите, относится ли это к вашему вопросу?   -  person huynhjl    schedule 08.12.2012


Ответы (1)


По-видимому, для 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)
}
person som-snytt    schedule 08.12.2012