switch
语句比Java更灵活,更强大,更适用。出于这个原因,我发现自己想要在Groovy中第一次使用嵌套的switch
。
有了这个:
outerSwitch:
switch( var1 ){
case 'x':
...
break
case 'y':
switch( var2 ){
case 'a':
// something
break outerSwitch
...
}
...
}
...我从Groovy编译器那里得到了一个可怕的消息" Groovy:带有命名标签的break语句只允许在循环中#34;。我不知道这与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
,然后根据assets/images
块中的适用情况进行更改。我只希望Groovy能提供更优雅的东西......
答案 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'