让我们看看下面的代码:
import scala.language.implicitConversions
class Foo
implicit def int2Foo(a: => Int): Foo = new Foo
def bar(foo: Foo) = {}
def bar(foo: Boolean) = {}
bar {
println("Hello")
64
}
此代码不打印任何内容,因为该块包含println("Hello")
视为=> Int
并且它被转换为Foo
by int2Foo
。但是如果我们省略重载函数,就会发生令人惊讶的事情bar(foo: Boolean)
import scala.language.implicitConversions
class Foo
implicit def int2Foo(a: => Int): Foo = new Foo
def bar(foo: Foo) = {}
bar {
println("Hello")
64
}
这会打印出来Hello
,因为它会评估块,并且64
在这种情况下,只有最后一条语句被视为按名称调用的参数。我无法理解这种差异背后存在什么样的理由。