Nad*_*seo 5 switch-statement fall-through dart
我今天开始学习Dart,而且我遇到了一些谷歌技能难以找到的东西.
如何在非空案例中进行翻版?
我的用例是这样的:我正在写一个sprintf实现(因为dart也没有这个),除了这个落空的东西之外它会工作.例如,在解析变量类型时,您可以使用"%x"与"%X",其中大写类型告诉格式化程序输出应该是大写的.
半伪代码看起来像:
bool is_upper = false;
switch (getType()) {
case 'X':
is_upper = true;
case 'x':
return formatHex(is_upper);
}
Run Code Online (Sandbox Code Playgroud)
我可以想到的其他方式,将是以下之一
1:
switch (getType()) {
case 'X': case 'x':
return formatHex('X' == getType());
}
Run Code Online (Sandbox Code Playgroud)
2:
var type = getType();
if (type in ['x', 'X']) {
return formatHex('X' == getType());
}
Run Code Online (Sandbox Code Playgroud)
现在,第二个选择几乎看起来不错,但是你必须记住,有11个案例,这意味着有11个if (type in []),这是我想要的更多打字.
那么,飞镖有一些// //$FALL-THROUGH$我不知道的吗?
谢谢.
小智 8
Dart规范提供了一种使用“ continue”使开关盒继续到另一个开关盒的方法:
switch (x) {
case 42: print("hello");
continue world;
case 37: print("goodbye");
break;
world: // This is a label on the switch case.
case 87: print("world");
}
Run Code Online (Sandbox Code Playgroud)
它可以在VM中运行,但是遗憾的是dart2js开关实现尚不支持该功能。
从飞镖语言之旅中,您的(2)示例应该是正确的。
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeClose();
break;
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试执行以下操作,则会出错
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break causes an exception to be thrown!!
case 'CLOSED':
executeClose();
break;
}
Run Code Online (Sandbox Code Playgroud)
编辑:这似乎只是由于 Dart 实现中的错误而起作用。请参阅Dart 1.x 语言规范,“17.15 继续”部分。
该错误现已修复,如评论中所述,因此不再有效。由于历史原因保留。
此外,Lasse 答案的简化是使用简单continue;而不是continue <label>;:
bool is_upper = false;
switch (getType()) {
case 'X':
is_upper = true;
continue;
case 'x':
return formatHex(is_upper);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2989 次 |
| 最近记录: |