微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在{时不使用/ /

如何解决在{时不使用/ /

我对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需要详尽无遗,否则它将无法编译。

这让我思考并尝试了不同的事情。我找到了解决此问题的方法

  1. 我可以在else添加一个with/when,以使其变得详尽无遗,但实际上我不需要别的,在这种情况下我也不想使用它。
  2. 我可以添加一个.let,所以它看起来像这样:myNullableVar?.let { it.var3 = "test789" }.let{} ....但这对我来说有点怪。它应该像这样工作吗?
  3. 使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?