2016-09-30 1 views
11

Я пытаюсь написать функцию, которая скажет мне, что строка хороша, nice означает, что строка имеет хотя бы одно повторение букв в строке. Но я не могу сделать возврат из лямбда, он всегда возвращает ложь, хотя условие в случае, если утверждение прошло. Может ли кто-нибудь объяснить мне, как сделать возвращение?Возврат из lambdas или Kotlin: 'return' здесь не допускается

Я попытался написать возвращение, но IDEA дал мне сообщение Котлин: 'возвращение' не разрешены здесь

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 

ответ

15

Вы можете маркировать лямбда, а затем использовать меченый возвращение:

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() 
} 
+0

Спасибо, ваш ответ также дает мне дополнительное объяснение по этому вопросу. –

7

Вы не можете сделать non-local return внутри лямбда, но вы можете изменить свою лямбду на анонимную функцию:

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() 
} 
+0

Спасибо, но это просто пример , Я знаю, что я могу разместить эту функцию на уровне isNice(), в любом случае спасибо. –

+0

Получил это. Я обновил свой ответ, чтобы удалить ненужный упрощенный пример. – mfulton26

Смежные вопросы