【问题标题】:Return from lambdas or Kotlin: 'return' is not allowed here从 lambdas 或 Kotlin 返回:此处不允许“返回”
【发布时间】:2016-09-30 18:53:18
【问题描述】:

我正在尝试编写一个函数,它会告诉我字符串很好,很好意味着字符串在字符串中至少有一个重复的字母。但是我不能从 lambda 返回,它总是返回 false,尽管 if 语句中的条件通过了。谁能解释一下如何退货?

我试图写 return,但 IDEA 给了我消息 Kotlin: 'return' is not allowed here

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您可以标记 lambda,然后使用标记返回:

    fun String.isNice(): Boolean {
        val hasRepeat = hasRepeat@ {
            for (i in 0 .. (length - 2)) {
                if (subSequence(i, i + 2).toSet().size == 1) {
                    return@hasRepeat 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】:

      您不能在 lambda 中执行 non-local return,但您可以将 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()
      }
      

      【讨论】:

      • 谢谢,但这只是一个例子,我知道,我可以将此函数放在 isNice() 级别上,无论如何谢谢。
      • 知道了。我已更新我的答案以删除不必要的简化示例。
      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多