kotlin 1.2.31
我有以下函数,试图从let
函数返回一个字符串。
但是,以下内容返回kotlin.unit
作为文本
fun replaceSpace(quote: String, ch: Char): String {
return quote.toCharArray().let {
for (i in it.indices) {
if(it[i] == ' ') {
it[i] = ch
}
}
}.toString()
}
我本以为拥有toString()
会返回一个字符串,但我得到kotlin.unit
但是,当我执行以下操作时,它可以正常运行。由于String(it)
将charArray转换为字符串。作为其在let
块中的最后一条语句,这将返回。但是,我想知道为什么toString()
方法不起作用
fun replaceSpace(quote: String, ch: Char): String {
return quote.toCharArray().let {
for (i in it.indices) {
if(it[i] == ' ') {
it[i] = ch
}
}
String(it)
}
}
答案 0 :(得分:3)
如果您只想用另一个Char替换String中一个Char的所有实例,则可以使用String.replace()
扩展名,它是Kotlin标准库的一部分:
quote.replace(' ', ch)
不需要对Strings,CharArrays或其他任何东西进行任何转换。我什至不会定义一个函数来封装它,您可能会完全删除replaceSpace
。
答案 1 :(得分:3)
如果您查看Kotlin's let documentation,您会发现let
函数将返回传递给它的函数。在您的情况下,由于for不会返回并且没有return语句,因此您不会在let函数内返回任何内容,因此,let将返回一个Unit。由于要在返回toString
函数时应用let
,因此将在toString
上应用Unit
,这显然不是您想要的。
同时,您要实现的目标(用给定字符替换所有空格)可以仅使用Kotlin标准函数来实现。如果您查看String Kotlin's documentation,将会发现有一个可以使用的替换功能,基本上可以帮助您实现所需的功能。
quote.replace(' ', ch)
我还建议您在此fantastic文章中阅读有关let
,also
,apply
,run
和with
的信息。
答案 2 :(得分:2)
此行为的原因是for
不是表达式。
但是这个问题的整个逻辑都令人费解。
整个功能可以替换为:
fun replaceSpace(quote: String, ch: Char) = quote.replace(" ", ch.toString())