我试图弄清楚退货在科特林如何工作。现在,我有一个带有两个嵌套的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子句?
答案 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(..) {...}
进行了适当的更改,您会发现代码可以按预期工作。