Какова цель kotlin контракта - PullRequest
5 голосов
/ 31 марта 2020

Читал источник кода функции применения и нашел

contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }

, а контракт содержит пустое тело, экспериментальный

@ContractsDsl
@ExperimentalContracts
@InlineOnly
@SinceKotlin("1.3")
@Suppress("UNUSED_PARAMETER")
public inline fun contract(builder: ContractBuilder.() -> Unit) { }

Какова реальная цель контракт и здесь ли остаться в следующих версиях?

1 Ответ

4 голосов
/ 31 марта 2020

Какова реальная цель контракта

Реальная цель 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 из эксперимента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...