返回后,Kotlin继续执行else条款
我正试图弄清楚退货在科特林是如何运作的。现在我有一个函数,它有两个嵌套的for循环 对于父函数getValue(),所有返回都应返回,其中一个似乎按照预期工作,另一个则没有返回后,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(
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
。这不是一种语言,而是一个逻辑问题,我建议您使用调试器逐步检查代码,并查看各种检查的值。