交换机/机箱-我们何时可以期望交换机操作员返工?

时间:2019-12-15 15:47:12

标签: dart

希望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;
}

1 个答案:

答案 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]太长了,因此您必须对此表示信任。)

是的,拥有此功能的唯一好处是具有一定的主观可读性,但这还不足以证明它是该语言的重中之重。

现在,这已经在hereherehere中进行了讨论。当与其他语言功能(例如一流的元组和对象分解)配对时,模式匹配可能会有一些用处。不幸的是,Dart也不具备这些功能中的许多功能,如果我们要讨论哪些功能会更受益,那么我绝对希望先拥有这些功能。

TL; DR-可能很快不会出现。