希望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;
}
答案 0 :(得分:0)
您要的是类似于pattern matching in C#的内容。这里不是发布有关Dart未来希望的地方。 StackOverflow是一个发布您遇到的问题的地方,以便其他人可以提供特定答案的帮助。
这就是这种情况。 Dart团队在各种upcoming versions of Dart上的路线图上都有很多工作要做,尽管我没有仔细阅读每篇文章,但我没有看到它们之间的模式匹配。而且,如果我在这里完全说实话,我同意模式匹配的优先级还不够高,他们无法以其他功能为代价而将注意力集中在模式匹配上,例如将可空变量完全释放。
如果我是Dart团队的成员,并且看到了这个建议,我会问这个功能如何使语言受益。通过模式匹配可以解决该语言中存在哪些问题或不足?带有模式匹配的切换块的几乎所有应用也可以通过一系列if块来完成:
使用模式匹配进行切换:
library(dplyr)
library(tidyr)
df %>%
pivot_longer(Reading1:Reading3,
names_to = "reading",
names_prefix = "Reading",
values_to = "value") %>%
group_by(SerialNo) %>%
mutate(offset = lag(value, 1),
measure = value - offset) %>%
select(SerialNo, reading, measure) %>%
pivot_wider(names_from = reading,
values_from = measure,
names_prefix = "Reading")
>
# A tibble: 5 x 4
# Groups: SerialNo [5]
SerialNo Reading1 Reading2 Reading3
<dbl> <dbl> <dbl> <dbl>
1 1 NA 2 5
2 2 NA 3 4
3 3 NA 1 9
4 4 NA 16 3
5 5 NA 7 2
如果阻止:
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;
}
(要说得更好一点,if块方法会减少行数。此外,switch块需要大量样板,因为每个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');
}
或case
都需要{ {1}}语句。)
此外,也不会有任何性能上的好处。开关块通常像哈希表一样工作,在O(1)恒定时间内达到所需的代码。但是,使用模式匹配是不可能的,因此为了支持此功能,具有模式匹配支持的语言倾向于将match语句完全预编译为其他内容,从而失去了哈希表的性能优势。这在C#中很明显,其中对于等效的if语句集,切换块中的模式匹配仅仅是语法糖。 (我不会在此处粘贴示例,因为A]太重要了,B]太长了,因此您必须对此表示信任。)
是的,拥有此功能的唯一好处是具有一定的主观可读性,但这还不足以证明它是该语言的重中之重。
现在那,这已经在here,here和here中进行了讨论。当与其他语言功能(例如一流的元组和对象分解)配对时,模式匹配可能会有一些用处。不幸的是,Dart也不具备这些功能中的许多功能,如果我们要讨论哪些功能会更受益,那么我绝对希望先拥有这些功能。
TL; DR-可能很快不会出现。