Котлин продолжает еще оговорку после возвращения - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь выяснить, как работает возврат в Котлине. Прямо сейчас у меня есть функция с двумя вложенными циклами.

Все возвраты должны возвращаться для родительской функции 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 вернет функцию верхнего уровня и выйдет из этой функции.

Кажется, я что-то упустил. Как сделать, чтобы первое возвращение не продолжалось до предложения else с printLn?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Операторы возврата работают нормально. Проблема с вашим кодом состоит в том, что единственный вызов checkStuff(obj) вызывает его возвращение false, поэтому никогда не вызывается следующее:

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

Если вы внесете соответствующие изменения в fun checkStuff(..) {...}, вы обнаружите, что код работает так, как вы ожидали.

0 голосов
/ 01 июля 2018

Вам нужно исправить логику 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"
                        ...
                    }
                    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...