使用let()标准函数返回字符串

时间:2019-03-26 16:15:19

标签: kotlin

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)
    }
}

3 个答案:

答案 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文章中阅读有关letalsoapplyrunwith的信息。

答案 2 :(得分:2)

此行为的原因是for不是表达式。

但是这个问题的整个逻辑都令人费解。

整个功能可以替换为:

fun replaceSpace(quote: String, ch: Char) = quote.replace(" ", ch.toString())