scala - Scala隐式类转换的作用域

标签 scala implicit-conversion

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 不可能在应用转换。因此,您获得的行为与您刚刚编写 toXXX((new A).a.b).xxx 完全相同。

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

相关文章:

scala - 如何查询 Array[String] 中的正则表达式匹配项?

scala - 如何解释 RDD.treeAggregate

c++ - 缩小转换范围

c++ - 运算符 T() 未在赋值中使用

c - 在C语言中,你能做到吗?整数我; i = get_long() % 20;

Scala:转换嵌套集合的惯用语法是什么?

scala - 用于包装不纯方法的效果?

scala - Spark 错误 : Unable to find encoder for type stored in a Dataset

scala - 集合如何对元素类型使用隐式转换?

c++ - 打印 Stringstream 输出指针