Возвращение из лямбда или Котлина: здесь не допускается возвращение

Я пытаюсь написать функцию, которая скажет мне, что строка хороша, 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()
}