可能没有什么区别,因为问题是基本的控制结构,但我是用Javascript写的。 (如果发生这种情况则标记为这样)
我熟悉这种类型的开关语句
case 'foo':
case 'bar':
do a;
do b;
do c;
break;
有没有办法让案件的一部分落空并适用于下一个案件但不是全部?也就是说,交换机的语法是否相当于:
if(my_var == 'foo' || my_var == 'bar') do a;
if(my_var == 'foo') do b;
if(my_var == 'bar') do c;
我觉得它应该是我常见的缺失,因为它似乎是一个非常有用的想法。
答案 0 :(得分:2)
不,遗憾的是,对于普通的switch语句,这是不可能的。
例如,解决方案是将其拆分为两个switch语句。
switch (x) {
case 'foo':
case 'bar':
a();
}
switch (x) {
case 'foo':
b();
break;
case 'bar':
c();
}
或者,正如乔建议的那样,只需重复一下这个功能:
switch (x) {
case 'foo':
a();
b();
break;
case 'bar':
a();
c();
}
使用更短的解决方案......这取决于具体情况。
答案 1 :(得分:2)
您无法做到这一点 - 只需将您的操作分离为可由任何案例调用的函数。它会使事情变得美观和可读。
var funcA = function() { /* do a */ };
switch (x) {
case 'foo':
funcA();
funcB();
break;
case 'bar':
funcA();
funcC();
break;
}
答案 2 :(得分:1)
我会这样做:
if (my_var == 'foo' || my_var == 'bar') {
do a;
}
switch (my_var) {
case 'foo':
do b;
break;
case 'bar':
do c;
break;
}
我认为这使得逻辑对读者来说最清楚。
答案 3 :(得分:1)
如果只有foo
和bar
分支是特殊的,并且您还有switch
的其他分支,则可以将if
个语句放入foo
和bar
的公共分支:
switch (my_var) {
case 'foo':
case 'bar':
do a;
if (my_var == 'foo') do b;
if (my_var == 'bar') do c;
break;
case 'other':
do d;
break;
case 'more':
do e;
break;
// ...and so on...
}
但仅在switch
中具有其他不同分支的两个基本相似的分支的异常情况下才有意义。
在正常情况下,Joe Enos有正确的方法:将逻辑分解为小的可重用位(函数调用开销is a non-issue)。做分支中的小位。