开关/外壳 - 我们何时可以预期开关操作员返工?



希望Dart开发人员将在开关/机箱运算符中添加值范围和范围检查 - 检查值是否在范围内,检查数组元素,使用相同的开关运算符检查多个变量:

int i=27;
switch (i) {
case 1..30:
break;
default:
}
List<int> a=[1,5,7,14,25,30];
switch (a) {
case a.contains(5):
break;
case a[1..4]>0:
break;
}
switch ([a,i]) {
case i==5:
case a[1..4]>0:
break;
case a[i] is int:
break;
}

你要求的东西类似于 C# 中的模式匹配。这不是发布您对Dart未来的希望的地方。StackOverflow是一个发布您遇到的问题的地方,以便其他人可以帮助提供特定的答案。

也就是说,情况是这样的。Dart团队在即将推出的各种Dart版本的路线图方面有很多工作要做,虽然我没有浏览过每个帖子,但我没有看到它们之间的模式匹配。如果我在这里说实话,我同意模式匹配的优先级还不够高,以至于他们以牺牲其他功能为代价来专注于它,例如,将可为空的变量完全发布。

如果我站在Dart团队的立场上,看到这个提议,我会问这个功能如何使语言受益。语言中存在哪些问题或不足之处可以通过模式匹配来解决?几乎任何具有模式匹配的开关块的应用也可以通过一系列if块来完成:

具有模式匹配的开关:

dynamic obj;
switch (obj) {
case obj == null:
print('obj is null');
break;
case obj is List:
print('length of obj is ${obj.length}');
break;
case obj is num && obj >= 5:
print('obj is greater than 5');
break;
default:
print('obj didn't match any conditions');
break;
}

如果阻止:

dynamic obj;
if (obj == null) {
print('obj is null');
} else if (obj is List) {
print('length of obj is ${obj.length}');
} else if (obj is num && obj >= 5) {
print('obj is greater than 5');
} else {
print('obj didn't match any conditions');
}

(为了更精细地说明这一点,if 块方法导致更少的行。更重要的是,开关块需要相当数量的样板,因为每个casedefault都需要一个break语句。

更重要的是,也不会有任何性能优势。开关块通常像哈希表一样工作,在 O(1( 常量时间内到达所需的代码。但是,模式匹配无法做到这一点,因此为了支持这一点,具有模式匹配支持的语言倾向于将匹配语句预编译为完全不同的内容,从而失去哈希表的性能优势。这在 C# 中很明显,其中开关块中的模式匹配只是等效的 if 语句集的语法糖。(我不会在这里粘贴它的例子,因为 A] 它无关紧要,B] 它太长了,所以你必须相信我。

所以,是的,拥有这个功能的唯一好处是一些主观的可读性,这还不足以证明它是语言的重中之重。

虽如此,这是这里、这里和这里讨论过的事情。当与其他语言功能(如一等元组和对象解构(配对时,模式匹配可能具有一些用处。不幸的是,Dart也没有很多这些功能,如果我们谈论哪些功能会受益更多,我肯定宁愿先拥有这些功能。

TL;DR - 可能不会很快。

最新更新