【问题标题】:Kotlin apply on String not working as expectedKotlin 适用于 String 未按预期工作
【发布时间】:2018-08-09 14:53:09
【问题描述】:

我正在尝试使用 kotlin 的所有功能,但似乎它们都不起作用,或者可能是我的错。

所以,applyString 不起作用。示例:

val str = someStr.apply {
    toUpperCase()
    if (contains("W")) replace("W", "w")
}

输入 -> xywz

输出 -> xywz

预期 -> XYwZ

Java 风格:

val str = it.text().toString().toUpperCase()
if (str.contains("W")) str.replace("W", "w")

输入 -> xywz

输出 -> XYwZ

预期 -> XYwZ

我做错了吗?

【问题讨论】:

  • 您正在寻找花哨的方法来做简单的事情。看看 TheOperator 的回答吧。

标签: android kotlin syntactic-sugar


【解决方案1】:

其实apply 不会返回你计算出来的值。您可能更愿意使用:runletwith。此外,可能更重要的是,您没有指定 else 路径。这可能会返回一个 Unit 而不是一个值,因此您可能需要指定应返回的内容。最后,这些方法中的调用没有被链接。首先调用toUpperCase 并没有改变任何东西......它几乎是死代码......所以你可能想写这样的东西:

val str = with(someStr) {
  toUpperCase().run {
    if (contains("W")) replace("W", "w")
    else this
  }
}

但是我只是使用 run/let/with 来演示它的用法,因为您已经使用过 apply...您显示的 Java 方式在这方面当然更容易,最简单的可能解决方案是 TheOperator 刚刚展示的那个首先省略您的条件,因为 replace 默认情况下区分大小写。

【讨论】:

  • 这不会从输入xywz返回XYwZ
  • 呵呵...是的...那是我的误读...我仍然不能推荐这样的结构;-)
  • +1 使用不同的条件转换函数也有类似的问题。将apply 换成run 实际上使函数返回了条件转换的结果
【解决方案2】:

toUpperCase() 返回字符串的副本(字符串是不可变的)。因此,您需要将返回的值存储为 apply() 中的独立(不是最后一个)语句,它会丢失。

另外,如果你返回一个表达式,你不能在没有else 的情况下使用if。在您的情况下,甚至不需要 contains()

您可能想做的是直接致电toUpperCase()replace()

val str = someStr.toUpperCase().replace("W", "w")

【讨论】:

    【解决方案3】:

    “申请”文件:

    以该值作为接收者调用指定的功能块,并 返回此值。

    所以它返回原始值(“这个值”)。

    你应该改用“let”:

    val str = someStr.let {
        it.toUpperCase().replace("W", "w")
    }
    

    但是你可以使用:

    val str = someStr.toUpperCase().replace("W", "w")
    

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2019-09-03
      • 2017-02-15
      • 2021-06-04
      相关资源
      最近更新 更多