Дважды посетить один и тот же случай в блоке Kotlin 'when'? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть 3 переключателя: A, B, C. Для A я хочу позвонить foo(). Для B я хотел бы позвонить bar(). А для C я хотел бы позвонить bar() и baz().

Ниже приведен код, который у меня сейчас не работает (хотя надеюсь, мои намерения ясны)

when (item.id) {
    R.id.button_a -> foo()
    R.id.button_b, R.id_button_c -> bar()
    R.id.button_c -> baz() // Duplicate label in when
}

Есть ли способ сделать это? Или мне нужно вместо этого использовать несколько блоков when или if/else?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Вы можете сделать что-то вроде:

when (item.id) {
            R.id.button_a -> foo()
            R.id.button_b -> bar()
            R.id.button_c ->{
                bar()
                baz()
            }
        }
1 голос
/ 03 августа 2020

A when предполагает, что каждое условие приводит к одному действию. (Несколько условий могут привести к одному и тому же действию, но не наоборот.) Итак, если существует соответствие «многие ко многим» между условиями и действиями, я думаю, вы не сможете избежать некоторого повторения.

Я вижу два основных подхода:

Вы можете структурировать код вокруг условий и повторить действие - или, по крайней мере, повторить ссылка на него через функцию - как в ответе chand mohd.

Или вы можете структурировать код вокруг действий и повторить условие:

if (item.id == R.id.button_a)
    foo();
if (item.id == R.id.button_b || item.id == R.id_button_c))
    bar();
if (item.id == R.id.button_c)
    baz();
* 1020. * В некотором смысле этот второй путь менее чист; это означает повторение item.id == много раз, а также повторение R.id_button_c. И это может быть немного сложнее, поскольку действия, выполняемые вместе, не обязательно вместе в коде.

Но это более гибко; вам не нужно повторять какие-либо действия или возиться с функциями. Легче вставлять действия, которые всегда выполняются. И если у вас есть некоторые общие ограничения (например, foo() не может быть вызван после bar(), тогда их легче кодировать и проверять.

Так что, в конечном итоге, это компромисс. Оба подхода допустимы ; лучший будет зависеть от деталей вашего конкретного случая, от соотношения повторяющихся условий к повторяющимся действиям, от продолжительности действий, от любых ограничений - от формы проблемы, которую вы пытаетесь решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...