Каковы преимущества контракта Kotlin callInPlace?
Может ли кто-нибудь объяснить мне, в чем преимущества Kotlin?callsInPlace
договор? Как компилятор использует знание того, что лямбда-функция будет вызвана на месте? Кроме того, разработчик получает какую-либо выгоду от этого? Например, смарткаст или что-то в этом роде?
Заранее спасибо.
1 ответ
Этот контракт не только сообщает компилятору, что лямбда вызывается на месте, но также (необязательно) количество раз , когда она вызывается. Это позволяет скомпилировать некоторый код, который был некомпилируемым до появления контрактов в Kotlin 1.3.
Пример из выступления Дмитрия Саввинова (внимание, на русском) об использовании этого контракта в stdlib:
public inline fun <R> run(block: () -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
fun foo() {
val x: Int
run {
x = 42 //Error in 1.2, ok in 1.3
}
println(x) //Error in 1.2, ok in 1.3
}
С этим контрактом компилятор знает, что:
- значение будет присвоено ровно один раз (переназначать значение
val
, даже с тем же значением). -
x
будет инициализирован к моментуprintln(x)
вызов (лямбда не просто передается вrun
функция, но на самом деле вызывается внутри нее).
Раньше компилятор не был уверен в этих вещах и на всякий случай выдавал ошибку.