Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回后,Kotlin继续执行else条款_Kotlin - Fatal编程技术网

返回后,Kotlin继续执行else条款

返回后,Kotlin继续执行else条款,kotlin,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(

我正试图弄清楚退货在科特林是如何运作的。现在我有一个函数,它有两个嵌套的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
}
val myArray=arrayOf(
MyObj(“字符串1”,mapOf(Pair(MyEnum.apple,“字符串2”)),
MyObj(“字符串2”,mapOf(成对(MyEnum.orange,“字符串1”),
配对(MyEnum.apple,“字符串3”),
MyObj(“字符串3”,mapOf(成对(MyEnum.orange,“字符串2”))
)
val myObj=myArray[1]
趣味主线(args:Array){
getValue(MyEnum.apple)
}
fun getValue(myEnum:myEnum){
myObj.myMap.forEach{(enum,str)->
if(enum==myEnum){
myArray.forEach{obj->
if(obj.name==str){
if(支票(obj)){
println(“checkStuff返回true”)
return//这将继续printLn
}
println(“返回错误”)
return//这似乎是按预期返回的
}
}
}否则{
println(“不应被击中”)
}
}
}
有趣的支票(obj:MyObj):布尔值{
返回obj.name==“字符串1”
}
数据类MyObj(val name:String,val myMap:Map)
枚举类MyEnum{
苹果、桔子、梨
}
checkStuff中的返回总是继续到printLn

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

我好像错过了什么。如何使第一次返回不继续到带有printLn的else子句?

您需要修复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"
                        ...
                    }
                    ...

返回语句工作正常。代码的问题在于,只有在调用
checkStuff(obj)
时,它返回false,因此永远不会调用以下内容:

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

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

代码无法编译。要讨论某些代码如何以及为什么会使用wy,我们需要一些实际编译和运行的代码。发布一个编译、运行和复制您的问题的完整的最小示例。我已经编辑了我的问题,以包含一些代码,这些代码将编译和复制我得到的行为。谢谢。所有这些
return
语句在被点击时将从整个
getValue
函数返回。至于“如果总是继续在println上返回checkStuff内部”,这是因为
checkStuff
仅使用数组的第三个元素调用一次,并且该元素的计算结果为
false
。这不是一种语言,而是一个逻辑问题,我建议您使用调试器逐步检查代码,并查看各种
检查的值。