Kotlin: заменить «каскад, если» на «когда» по сравнению с другими переменными - PullRequest
0 голосов
/ 03 мая 2018

Я начинаю с Котлина и сталкиваюсь с проблемой. У меня есть три константы (назовем их VAL_A, VAL_B и VAL_C), и я делаю это назначение:

var variable = if (value < VAR_A) {
            valueA
        } else if (value <= VAR_B) {
            valueB
        } else if (value <= VAR_C) {
            valueC
        } else {
            valueD
        }

Я хочу использовать блок when вместо if else, но я не знаю, как сделать значение VAR_C единицей.

Спасибо и извините за мой английский!

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Это должно быть самым простым эквивалентом вашего if выражения:

var variable = when {
    value < VAR_A -> valueA
    value <= VAR_B -> valueB
    value <= VAR_C -> valueC
    else -> valueD
}
0 голосов
/ 03 мая 2018

Идеальный синтаксис, который вы можете искать, это

when (value) {
    < valueA -> valueA
    <= valueB -> valueB
    <= valueC -> valueC
    else -> valueD
}

К сожалению, это невозможно, поскольку операторы сравнения являются перегрузками операторов для функций, требующих приемника:

value < valueA

совпадает с

value.compareTo(valueA) < 0

Поскольку compareTo не является ключевым словом, подобным is или in (как используется в ответе zsmb13), вам необходимо создать этот блок when:

when {
    value < valueA -> valueA
    value <= valueB -> valueB
    value <= valueC -> valueC
    else -> valueD
}

Котлин полон чудесных вещей. Вы могли бы придумать несколько альтернативных решений, которые вообще не используют условное каскадирование. Мне кажется, что вы хотите, чтобы value округлился до ближайшего из valueA, valueB, valueC и valueD. Так, например, альтернативой может быть:

var variable = listOf(valueA, valueB, valueC, valueD).sorted().first { value <= it }

Это выберет ближайшее значение, большее, чем value из набора, и присвоит его variable.

0 голосов
/ 03 мая 2018

Если, например, верно, что 0 <<code>VAR_A <<code>VAR_B <<code>VAR_C, вы можете сделать это:

var variable = when (value) {
    in 0..VAR_A -> valueA
    in VAR_A..VAR_B -> valueB
    in VAR_B..VAR_C -> valueC
    else -> valueD
}

Но, возможно, это наиболее читаемая форма when для этой задачи:

var variable = when {
    value <= VAR_A -> valueA
    value <= VAR_B -> valueB
    value <= VAR_C -> valueC
    else -> valueD
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...