Давайте посмотрим код ниже:Scala неявное преобразование на вызов по имени параметра работает по-разному в зависимости от функции перегружен или не
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
в данном случае рассматривается в качестве параметра вызова по имени , Я не могу понять, какое обоснование существует за этой разницей.
Связанная проблема: https://issues.scala-lang.org/browse/SI-3237 –
Невозможно, чтобы это поведение предназначалось, если только я чего-то не упускаю. Даже если он соответствует спецификации, он является чрезвычайно противоречивым и серьезно подвержен ошибкам (например, что, если кто-то удаляет перегрузку, которая, по-видимому, используется нигде, что приводит к тому, что параметр by-name ведет себя по-разному). –
Обтекание блока в '{...}: Int' также изменяет поведение. –