Использование стандартной функции let () для возврата строки - PullRequest
0 голосов
/ 26 марта 2019
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 ]

3 голосов
/ 26 марта 2019

Если вы просто хотите заменить все экземпляры одного Char в строке другим Char, вы можете использовать расширение String.replace(), которое является частью стандартной библиотеки Kotlin:

quote.replace(' ', ch)

Не должно быть необходимости делать какие-либо преобразования в Strings, CharArrays или что-либо еще. Я бы даже не определил функцию для инкапсуляции этого, вы, вероятно, можете полностью удалить replaceSpace.

3 голосов
/ 27 марта 2019

Если вы посмотрите на документацию let Kotlin , вы увидите, что функция let возвращает любую функцию, которую вы ей передаете.В вашем случае, поскольку for не возвращает и нет оператора return, вы не возвращаете ничего внутри функции let, следовательно, let будет возвращать Unit.Поскольку вы применяете toString при возврате функции let, вы будете применять toString к Unit, что явно не то, что вам нужно.

В то же время, что выПопытка достичь (заменить все пробелы с заданным символом) может быть достигнута с помощью только стандартных функций Kotlin.Если вы посмотрите документацию String Kotlin , то увидите, что вы можете использовать функцию замены, которая в основном поможет вам достичь того, чего вы хотите.

quote.replace(' ', ch)

Я также рекомендую вамчитать о let, also, apply, run и with в этой фантастической статье.

2 голосов
/ 26 марта 2019

Причина такого поведения в том, что for не является выражением.

Но вся логика этого вопроса довольно запутанная.

Эта целая функция может быть заменена на:

fun replaceSpace(quote: String, ch: Char) = quote.replace(" ", ch.toString())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...