在这个示例中,Scala是如何深入理解隐式工作的
在书中对Scala进行了深入研究。下面是隐式作用域的示例:在这个示例中,Scala是如何深入理解隐式工作的,scala,implicit-conversion,traits,Scala,Implicit Conversion,Traits,在书中对Scala进行了深入研究。下面是隐式作用域的示例: 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
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
我这里的问题是,在上面给出的示例中,您是如何隐式地发现trait栏的实现的?显然,对于Foo.Bar,它的工作原理类似于Foo#Bar,也就是说,
如果T是一个类型投影S#U,那么S的各个部分以及T本身
都在隐式范围内(规范的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)
}