Каковы преимущества контракта 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
}

С этим контрактом компилятор знает, что:

  1. значение будет присвоено ровно один раз (переназначать значение val, даже с тем же значением).
  2. xбудет инициализирован к моменту println(x)вызов (лямбда не просто передается в runфункция, но на самом деле вызывается внутри нее).

Раньше компилятор не был уверен в этих вещах и на всякий случай выдавал ошибку.

Другие вопросы по тегам