Groovy从嵌套交换机(不在循环中)突破外部​​交换机?

时间:2018-05-05 19:16:17

标签: groovy nested switch-statement

Groovy中的

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

有了这个:

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

...我从Groovy编译器那里得到了一个可怕的消息" Groovy:带有命名标签的break语句只允许在循环中#34;。我不知道这与Java是否相同。

有一个显而易见的愚蠢的解决方法:您将外部switchwhile( 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,然后根据assets/images块中的适用情况进行更改。我只希望Groovy能提供更优雅的东西......

1 个答案:

答案 0 :(得分:0)

不确定中断行为,但如果重构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'