Groovy从嵌套开关(不在循环中)断开外部开关?
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
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
,而不是中断
。我可能是想错了!