2016-09-30 101 views
11

我想写的函数会告诉我,字符串很好,nice意味着字符串中至少有一个字母重复的字符串。但我不能从lambda返回,它总是返回false,尽管if语句中的条件通过。有人能解释我如何回报?从lambdas或Kotlin返回:'返回'是不允许在这里

我试图写回,但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() 
} 

输出继电器是:

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在lambda里面,但你可以改变你的lambda到一个匿名函数:

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