我正在尝试使用kotlin的所有功能,但似乎其中一些功能无法正常工作,或者可能是我的错。
因此,apply
至String
不起作用。示例:
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
我做错什么了吗?
答案 0 :(得分:4)
toUpperCase()
返回字符串的副本(字符串是不可变的)。因此,您需要存储返回的值,因为它会丢失apply()
中的独立(不是最后)语句。
此外,如果返回表达式,则不能在没有if
的情况下使用else
。您甚至不需要contains()
。
您可能想做的是直接致电toUpperCase()
和replace()
:
val str = someStr.toUpperCase().replace("W", "w")
答案 1 :(得分:2)
实际上apply
不会返回您计算出的值。您可能更想使用:run
,let
或with
。另外,可能更重要的是您没有指定else
路径。这可能会返回一个Unit
而不是一个值,因此您可能想要指定否则应返回的内容。最后,这些方法中的调用没有链接。首先调用toUpperCase
并不会改变任何内容……这几乎是无效的代码……所以您可能想要编写如下内容:
val str = with(someStr) {
toUpperCase().run {
if (contains("W")) replace("W", "w")
else this
}
}
但是,我刚刚使用run / let / with演示了它的用法,就像您已经使用了apply ...在这方面,您所展示的Java方式当然更容易,而最简单的解决方案就是TheOperator首先忽略您的情况,因为replace
默认情况下区分大小写。
答案 2 :(得分:0)
“应用”文档:
以该值作为其接收者调用指定的功能块,并 返回此值。
因此它返回原始值(“此值”)。
您应该使用“ let”代替:
val str = someStr.let {
it.toUpperCase().replace("W", "w")
}
但是您可以使用:
val str = someStr.toUpperCase().replace("W", "w")