Использование стандартной функции let() для возврата строки

#kotlin

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

Комментарии:

1. toString() не работает, потому что последнее выражение, которое у вас есть внутри блока let, — это цикл for, а его тип — Unit. Итак, вы вызываете toString() для модуля. Смотрите kotlinlang.org/docs/reference /…

Ответ №1:

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

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

 quote.replace(' ', ch)
  

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

Ответ №2:

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

 quote.replace(' ', ch)
  

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

Ответ №3:

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

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

Всю эту функцию можно заменить на:

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