рассмотрим этот код:
class DelayedInt(val value: Int) {
var locked = true
}
object DelayedInt {
implicit def delayedIntToInt(del: DelayedInt) = {
if (del.locked) throw new RuntimeException("not yet!")
del.value
}
}
object Main {
var queue: Seq[() => Int] = Seq.empty
def queueInt(int: => Int): Unit = {
queue :+= int _
}
def printQueue(): Unit =
for (f <- queue)
println("int is: " + f.apply())
def main(args: Array[String]): Unit = {
val di = new DelayedInt(42)
// println(5 + di) // throws exception
queueInt(5 + di) // OK
queueInt(di) // OK
di.locked = false
printQueue()
}
}
Класс DelayedInt
выдает исключение при преобразовании в int, если только он не разблокирован явно.
Функция println
должна завершиться сбоем, посколькуэто вызывает неявное преобразование.
queueInt
функция работает нормально, по-видимому, потому что она использует параметры по имени и неявное преобразование не вызывается до printQueue
.
Что мне неясно, так это как Scala решаеткогда запустить неявное преобразование?Особенно в случае queueInt(di)
, он должен каким-то образом выяснить, что результат будет правильного типа, без использования неявного преобразования.
Какие шаги для оценки этого?