如何解决在{时不使用/ /
我对Kotlin
很陌生,我想弄清楚Kotlin的scope functions
。
我的代码如下:
with(something) {
when {
equals("test") -> var1 = "test123"
startsWith("test2") -> var2 = "test456"
contains("test3") -> myNullableVar?.let { it.var3 = "test789" }
}
}
因此,在我使用.let
函数进入第三张支票之前,我的with
函数不需要很详尽(我不返回任何东西,我只是在做赋值)。在我的第三次检查中,我将.let
用作空检查...,但仅用于it.var3
的赋值(如果不是null
)。当我知道Kotlin的.let
函数按标准返回正文的结果时,我不需要返回任何内容。
尽管如此,我的with/when
需要详尽无遗,否则它将无法编译。
- 我可以在
else
上添加一个with/when
,以使其变得详尽无遗,但实际上我不需要别的,在这种情况下我也不想使用它。 - 我可以添加另一个
.let
,所以它看起来像这样:myNullableVar?.let { it.var3 = "test789" }.let{}
....但这对我来说有点怪。它应该像这样工作吗? - 使用
If(xy==null){...}else{...}
的东西,但我想我可以用Kotlin来解决这个问题
因为我是Kotlin的新手,所以我不确定如何正确处理此案。我可能会同意我的第二个想法,因为“它可行”。还是我不应该使用.let
进行空检查?添加另一个空的。let{}
?还是我根本没有得到零安全概念?我在这里有点失落。感谢您的帮助。
解决方法
这似乎是功能的不幸组合...
when
仅在不返回值时才是非穷举的。问题是with()
函数确实返回一个值。而且由于when
位于底部,因此它的值就是返回的值,因此在这种情况下,它必须是详尽的。
那么,即使您省略了“ test3”分支,它为什么也不坚持使用else
分支呢?那是因为分配没有价值。 (它们的计算结果为Unit
,这是Kotlin对于不返回有用值的函数的特殊类型。)如果每个分支都给出Unit
,则Kotlin似乎 * 为很高兴推断出默认分支也给出了Unit
。
但是“ test3”分支返回其他内容-myNullableVar
的类型。那么when
推断什么类型呢?该类型和Unit
的最接近的通用父类型,即顶部类型Any?
。而且 now 现在需要一个明确的else
分支!
那该怎么办?
您找到了一些选择,但都不是理想选择。还有更多,同上!
-
您可以从该分支返回一个明确的
Unit
:contains("test3") -> { myNullableVar?.let { it.var3 = "test789" }; Unit }
-
您可以从
Unit
返回一个明确的with()
:contains("test3") -> myNullableVar?.let { it.var3 = "test789" } } Unit }
-
您可以为
with()
指定一个明确的类型。 (它具有两个类型的参数,因此您需要从其参数的类型开始同时给出两者):with<String,Unit>("abc") {
恐怕我还没有找到一个明显的最佳答案……
要回答您的最后一个问题:是的,?.let{
完全是惯用的,并且对于null检查是很常见的。在这种情况下,用if
替换它可以解决类型问题:
contains("test3") -> { if (myNullableVar != null) myNullableVar.var3 = "test789" }
但是,尽管myNullableVar
是一个属性,而不是一个局部变量,但它会引起长距离竞争,因此会打开竞争条件(如果另一个线程在测试和赋值之间将其设置为null ?),因此编译器会抱怨-这就是为什么人们改用let
的原因!
(**我找不到有关此行为的参考文献。上面是否有正式字眼?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。