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