gpt4 book ai didi

kotlin - 为什么不 check()、require() 和 assert() 导致智能转换?

转载 作者:行者123 更新时间:2023-12-01 01:43:58 29 4
gpt4 key购买 nike

考虑以下代码片段:

object C {
@JvmStatic
fun main(vararg args: String) {
val s: String? = null
check(s != null) {
"The string is null"
}
require(s != null) {
"The string is null"
}
assert(s != null) {
"The string is null"
}
s.length
}
}

虽然两者 check()require()
contract {
returns() implies value
}

在他们的 body 中,上面的代码仍然无法编译,迫使我使用 ?. :
s?.length

!! :
s!!.length

为什么在上面的代码中没有执行智能转换?

最佳答案

我回答了 related question前阵子关于assert的区别和 require . TL;博士:assert不保证抛出异常,但 require是。在 1.3 中,它也使用了契约,这意味着如果方法返回,编译器知道该语句是正确的,并且如果适用,它可以应用智能转换。

这解释了为什么assert不这样做;从断言返回确实 不是 意味着该陈述是真实的。使用您拥有的代码,它不会抛出异常,除非 ea是真的。即使使用 1.3,断言也不会触发智能转换。
checkrequire两者都在 1.3 及更高版本上触发智能转换(由于契约(Contract)),断言不会(没有契约(Contract),也不能保证如果条件失败,它实际上会抛出异常)。

我找到了 this在 Kotlin 论坛上发帖,确切地询问您是什么。联系人存在很长时间,但 this帖子也支持了我最初的假设:当联系人存在时,他们还没准备好 .有效禁用,正如第二篇文章所提到的。这就是为什么智能 Actor 不起作用。

然而,在 Kotlin 1.3 中,合约被释放了。如果您升级,您会看到它确实有效(至少对我而言如此)。

1.3-M2 中添加了完整的合约支持,这是 1.3 的预发布版本。

关于kotlin - 为什么不 check()、require() 和 assert() 导致智能转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com