Какова реальная цель контракта
Реальная цель Kotlin контрактов - помочь компилятору сделать некоторые предположения, которые не могут быть сделано само собой. Иногда разработчик знает больше, чем компилятор об использовании определенной функции, и этому конкретному использованию можно научить компилятору.
Я приведу пример с callsInPlace
, так как вы упомянули это.
Представьте, что у вас есть следующая функция:
fun executeOnce(block: () -> Unit) {
block()
}
И вызовите ее следующим образом:
fun caller() {
val value: String
executeOnce {
// It doesn't compile since the compiler doesn't know that the lambda
// will be executed once and the reassignment of a val is forbidden.
value = "dummy-string"
}
}
Здесь Kotlin контракты приходят на помощь. Вы можете использовать callsInPlace
, чтобы указать компилятору, сколько раз будет вызываться лямбда.
@OptIn(ExperimentalContracts::class)
fun executeOnce(block: ()-> Unit) {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
}
@OptIn(ExperimentalContracts::class)
fun caller() {
val value: String
executeOnce {
// Compiles since the val will be assigned once.
value = "dummy-string"
}
}
здесь, чтобы остаться в следующих версиях?
Кто знает. Они все еще экспериментальные после одного года, что является нормальным для основной функции. Вы не можете быть на 100% уверены, что они выйдут из эксперимента, но, поскольку они полезны и находятся здесь с одного года, по моему мнению, вероятно, они будут go из эксперимента.