Возвращение из лямбда или Котлина: здесь не допускается возвращение
Я пытаюсь написать функцию, которая скажет мне, что строка хороша, nice означает, что строка имеет по крайней мере одно повторение букв в строке. Но я не могу сделать возврат из лямбда, он всегда возвращает ложь, хотя условие в том случае, если утверждение прошло. Может ли кто-нибудь объяснить мне, как сделать возвращение?
Я попытался написать return, но IDEA дал мне сообщение Kotlin: "return" здесь не допускается
fun main(args: Array<String>) {
println("sddfsdf".isNice())
}
fun String.isNice(): Boolean {
val hasRepeat = {
for (i in 0 .. (length - 2)) {
if (subSequence(i, i + 2).toSet().size == 1) {
true
println(subSequence(i, i + 2))
}
}
false
}
return hasRepeat()
}
ouput:
dd
false
Ответы
Ответ 1
Вы можете пометить лямбда, а затем использовать помеченный возврат:
fun String.isNice(): Boolean {
val hasRepeat = [email protected] {
for (i in 0 .. (length - 2)) {
if (subSequence(i, i + 2).toSet().size == 1) {
[email protected] true
println(subSequence(i, i + 2)) // <-- note that this line is unreachable
}
}
false
}
return hasRepeat()
}
или вы можете использовать именованную локальную функцию, если вам не нужна hasRepeat
для ссылки на функцию:
fun String.isNice(): Boolean {
fun hasRepeat(): Boolean {
for (i in 0 .. (length - 2)) {
if (subSequence(i, i + 2).toSet().size == 1) {
return true
}
}
return false
}
return hasRepeat()
}
Ответ 2
Вы не можете сделать нелокальное возвращение внутри лямбды, но вы можете изменить свою лямбду на анонимную функцию:
fun String.isNice(): Boolean {
val hasRepeat = fun(): Boolean {
for (i in 0..(length - 2)) {
if (subSequence(i, i + 2).toSet().size == 1) {
return true
}
}
return false
}
return hasRepeat()
}