Groovy从嵌套开关(不在循环中)断开外部开关?

Groovy从嵌套开关(不在循环中)断开外部开关?,groovy,nested,switch-statement,Groovy,Nested,Switch Statement,Groovy中的switch语句比Java中的语句更加灵活、强大和适用。出于这个原因,我刚刚发现自己想在Groovy中第一次使用嵌套的开关 为此: outerSwitch: switch( var1 ){ case 'x': ... break case 'y': switch( var2 ){ case 'a': // something break out

Groovy中的
switch
语句比Java中的语句更加灵活、强大和适用。出于这个原因,我刚刚发现自己想在Groovy中第一次使用嵌套的
开关

为此:

outerSwitch:
switch( var1 ){
    case 'x': 
        ...
        break
    case 'y':
        switch( var2 ){
            case 'a':
            // something
            break outerSwitch
            ...
        }
    ...
}
。。。我从Groovy编译器那里得到一条可怕的消息,说“Groovy:只允许在循环中使用带命名标签的break语句”。我不知道这与Java是否相同

有一个明显的愚蠢的解决办法:你用
while(true)
将你的外部
开关
括起来,将
外部开关
标签应用到该开关上,并在外部
开关
的末尾放一个
break
语句

或者你可以为(inti=0;i<1;i++)做一个
。。。或者对同样的事情使用Groovy er习惯用法,我忘记了所有选项是什么。。。虽然试过

outerSwitch:
1.times{
    switch( var1 ){
        ...
}
。。。我发现Groovy编译器给出了同样令人讨厌的消息。看来你不能用闭包来愚弄它

Groovy工具箱和技巧盒中是否有任何东西可以让您更明智地从嵌套的
开关跳出外部
开关

问题是,我想,当你从一个
案例
块中断开
时,你不会用一个值来断开它。。。如果你能
break true
break'fiddle de dee'
有明显的方法来解决这个问题


一个明显的解决方法是,您可以在嵌套的
开关
前面加上
def breakouter=false
,然后在
案例
块中根据需要进行更改。我只希望Groovy能提供更优雅的东西

不确定中断行为,但如果重构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条件是一个闭包,如果它返回true,它将执行case;第二个是一个列表列表,如果外部列表包含该值,它将执行case

这段代码基本上复制了原始代码段中的功能,但采用了平面切换结构。在我看来,与标签决裂,即使有效,也不是一个好模式

输出:

~> groovy test.groovy 

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

谢谢是的,同意标签。在我看来,
switch
语句的层次结构的想法是在这个问题上,这似乎是自然需要的。但是,与其使用这种“裸”(并且可能非常大)的多
开关
结构,不如在外部
开关
案例
块中调用方法。然后,每一个都可以返回一个可以操作的值:因此“内部”
开关
案例块可以调用
返回x
,而不是
中断
。我可能是想错了!