Groovy вырваться из внешнего переключателя от вложенного переключателя (не в цикле)? - PullRequest
0 голосов
/ 05 мая 2018

switch операторы в Groovy бесконечно более гибки, мощны и применимы, чем в Java. По этой причине я только что захотел использовать вложенный switch впервые в Groovy.

С этим:

outerSwitch:
switch( var1 ){
    case 'x': 
        ...
        break
    case 'y':
        switch( var2 ){
            case 'a':
            // something
            break outerSwitch
            ...
        }
    ...
}

... Я получаю ужасное сообщение от компилятора Groovy, в котором говорится: «Groovy: оператор break с именованной меткой разрешен только внутри циклов». Я не знаю, то же самое с Java.

Существует очевидный глупый обходной путь: вы заключаете свой внешний switch в while( true ), применяете к нему метку outerSwitch и помещаете оператор break в конце вашего внешнего switch.

Или вы могли бы сделать for( int i = 0; i < 1; i++ ) ... или использовать идиому Groovy-er для той же вещи, я забыл, каковы все варианты ... хотя попробовал

outerSwitch:
1.times{
    switch( var1 ){
        ...
}

... Я обнаружил, что Groovy-компилятор выдает такое же неприятное сообщение. Так что, похоже, нельзя обмануть его замыканием.

Есть ли в Groovy наборы инструментов и наборы трюков, которые позволяют более разумно выпрыгнуть из внешнего switch из вложенного switch?

Проблема, я полагаю, в том, что когда вы break из case блока не делаете это со значением ... если бы вы могли перейти break true или break 'fiddle-de-dee', это было бы очевидно способы решить это.

Очевидным обходным решением является то, что вы можете предшествовать вложенному switch с def breakouter = false, а затем изменить его, как это применимо, в блоке case. Я просто надеюсь, что Groovy предоставит что-то более элегантное ...

1 Ответ

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

Не уверен насчет поведения разрыва, но если рефакторинг вашего оператора switch возможен, возможно, сработает следующее:

def var1 = "y"
def var2 = "a" 

switch ([var1, var2]) {
  case { it.first() == "x"}: 
    println "var1 == 'x'"
    break

  case [['y', 'a']]:
    println "var1 == 'y', var2 == 'a'"
    break

  default: 
    println "something else"
}

, где первое условие case - это закрытие, которое будет исполнять case, если оно возвращает true, а второе - список списков, который будет выполнять case, если внешний список содержит значение.

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

Выход:

~> groovy test.groovy 

var1 == 'y', var2 == 'a'
...