Kotlin在返回后继续else子句

时间:2018-06-30 23:24:08

标签: 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内部的返回值如果始终返回到printLn上。

从阅读文档开始,我认为添加return @ getValue将返回顶层函数,并退出该函数。

我似乎缺少一些东西。我该如何使第一次返回不与printLn一起继续到else子句?

2 个答案:

答案 0 :(得分:0)

您需要修正 if语句逻辑, 当前状态为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"
                        ...
                    }
                    ...

答案 1 :(得分:0)

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

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

如果您对fun checkStuff(..) {...}进行了适当的更改,您会发现代码可以按预期工作。