正在阅读 apply 函数代码源并发现
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
并且合约有一个空体,实验性的
@ContractsDsl
@ExperimentalContracts
@InlineOnly
@SinceKotlin("1.3")
@Suppress("UNUSED_PARAMETER")
public inline fun contract(builder: ContractBuilder.() -> Unit) { }
真正的目的是什么contract它会保留在下一个版本中吗?
合同的真正目的是什么
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"
}
}
这里是科特林合同来帮忙吧。您可以使用callsInPlace
告诉编译器 lambda 将被调用多少次。
@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% 确定它们会退出实验,但由于它们很有用,而且它们已经存在一年了,在我看来,它们很可能会退出实验。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)