Scala似乎在最大可能的表达式上应用了隐式类转换,如以下示例所示:

scala> class B { def b = { println("bb"); true } }
defined class B

scala> class A { def a = { println("aa"); new B } }
defined class A

scala> (new A).a.b
aa
bb
res16: Boolean = true

scala> class XXX(b: => Boolean) { def xxx = 42 }
defined class XXX

scala> implicit def toXXX(b: => Boolean) = new XXX(b)
toXXX: (b: => Boolean)XXX

scala> (new A).a.b.xxx
res18: Int = 42


我对此感到非常高兴,但是我的问题是SLS的哪一部分指定了此行为?例如,为什么它不首先将(new A).a.b评估为true,而仅对该值应用转换?

最佳答案

包含隐式转换的行

(new A).a.b.xxx


由编译器(即在编译时)转换为

toXXX((new A).a.b).xxx


如果在启动Scala时使用-Xprint:typer选项,我们可以看到这一点。

private[this] val res3: Int = $line5.$read.$iw.$iw.toXXX(new $line2.$read.$iw.$iw.A().a.b).xxx;


由于此转换发生在编译时而不是运行时,因此Scala在应用转换之前不可能将(new A).a.b评估为true。因此,您得到的行为与您刚开始编写toXXX((new A).a.b).xxx完全相同。

关于scala - Scala隐式类转换的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10727508/

10-16 21:29