Давайте посмотрим код ниже:
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
с помощью 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
в данном случае, обрабатывается как параметр вызова по имени. Я не могу понять, какое обоснование стоит за этой разницей.
{...}:Int
также меняет поведение. - person Ben Reich   schedule 07.07.2015