【发布时间】: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