【问题标题】:Kotlin continuing to else clause after returnKotlin 在返回后继续使用 else 子句
【发布时间】:2018-06-30 23:24:07
【问题描述】:

我试图弄清楚在 Kotlin 中返回是如何工作的。现在我有一个带有两个嵌套 for 循环的函数。

父函数 getValue() 的所有返回都应该返回,一个似乎按预期工作,另一个没有。

val myArray = arrayOf(
    MyObj("String 1", mapOf(Pair(MyEnum.apple, "String 2"))),
    MyObj("String 2", mapOf(Pair(MyEnum.orange, "String 1"),
            Pair(MyEnum.apple, "String 3"))),
    MyObj("String 3", mapOf(Pair(MyEnum.orange, "String 2")))
)

val myObj = myArray[1]

fun main(args: Array<String>) {
    getValue(MyEnum.apple)
}

fun getValue(myEnum: MyEnum) {
    myObj.myMap.forEach { (enum, str) ->
        if (enum == myEnum) {
            myArray.forEach {obj ->
                if (obj.name == str) {
                    if (checkStuff(obj)) {
                        println("checkStuff returned true")
                        return // this continues to printLn
                    }
                    println("returned false")
                    return // This appears to return as expected
                }
            }
        } else {
            println("Should not be hit")
        }
    }
}

fun checkStuff(obj: MyObj): Boolean {
    return obj.name == "String 1"
}

data class MyObj (val name: String, val myMap: Map<MyEnum, String>)

enum class MyEnum {
    apple, orange, pear
}

checkStuff 中的 return if 总是继续到 printLn。

通过阅读文档,我认为添加 return@getValue 将返回顶级函数并退出该函数。

我似乎错过了什么。如何使第一次返回不继续使用 printLn 的 else 子句?

【问题讨论】:

  • 代码无法编译。要讨论一些代码如何以及为什么会出现这种情况,我们需要一些可以实际编译和运行的东西。发布一个完整的最小示例来编译、运行和重现您的问题。
  • 我已经编辑了我的问题以包含一些代码,这些代码将编译和重现我得到的行为。谢谢。
  • 所有这些return 语句在被命中时将从整个getValue 函数返回。至于“checkStuff 中的返回,如果始终继续到 println。”,这是因为 checkStuff 仅在数组的第三个元素上调用一次,并且在该元素上计算为 false。这不是一种语言,而是一个逻辑问题,我建议使用调试器单步执行您的代码,并查看您的各种 if 检查操作的值。

标签: kotlin


【解决方案1】:

你需要修正你的 if-statements 逻辑, 在当前状态checkStuff 无法返回true

fun getValue(myEnum: MyEnum) {
    myObj.myMap.forEach { (enum, str) ->
        if (enum == myEnum) { // Pair(MyEnum.APPLE, "String 3")
            myArray.forEach { obj -> // str = "String 3"
                if (obj.name == str) { // obj.name = "String 3"
                    if (checkStuff(obj)) {  // "String 3" == "String 1"
                                            // checkStuff: obj.name == "String 1"
                        ...
                    }
                    ...

【讨论】:

    【解决方案2】:

    return 语句工作正常。您的代码的问题是,唯一一次调用 checkStuff(obj) 它返回 false,因此永远不会调用以下代码:

    `println("checkStuff returned true")
     return // this continues to printLn`
    

    如果您对fun checkStuff(..) {...} 进行适当的更改,您会发现代码的工作方式与您预期的一样。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2022-11-03
      • 2020-07-09
      • 2014-01-29
      相关资源
      最近更新 更多