斯卡拉的範圍似乎適用於最大可能表達的隱含級轉化,如下面的例子: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
,並且僅對該值應用轉換?
@Daniel有趣的是,由於此行爲目前使得scalaz的'(file:java.io.File).exists.pure [IO]'按假定的方式工作('io(file.exists)'),否則IO操作會實際上是在IO之外進行的。 – ron
更新:http://groups.google.com/group/scala-language/browse_thread/thread/c8327695dfdceecd – ron
正在進行勸說我建議您使用提供的信息回答您的問題。答案對我有意義。 –