使用了下 Dart 语言,发现一些特性的设计得非常缜密,例如 List Comprehension

2020-03-09 02:06:44 +08:00
 yech1990

就拿大量使用 List Comprehension 的 Python 做比较,

这些特性 Python 需要分为多个 List Comprehension 且外层嵌套逻辑来实现,比如产生这样的一个 List:

( Dart 的实现)

void main() {
  print([
    if (2 > 1) 222 else 333,
    if (2 > 3) 444,
    for (int i in Iterable.generate(10)) if (i % 3 == 1) i,
    for (int i in Iterable.generate(10, (x) => x + 100)) if (i % 2 == 0) i
  ]);
}

output: [222, 1, 4, 7, 100, 102, 104, 106, 108]

https://dartpad.dev/540d15e9a25afb2159ee1b380e98d906

( Python 的实现)

print(
    [if (2 > 1) 222 else 333] + 
    ([444] if (2 > 3) else []) +
    [i for i in range(10) if i % 3 == 1] +
    [i + 100 for i in range(10) if (i + 100) % 2 == 0]
)
3773 次点击
所在节点    Dart
12 条回复
widewing
2020-03-09 03:42:34 +08:00
说真的,你真的觉得上面的比下面的舒服吗?
clockwise9
2020-03-09 07:06:01 +08:00
不懂 dart 但是懂一点 python,如果生产环境也这么用的话,会不会难 debug:咦这个函数已经调用过了为啥什么输出都没有?
noqwerty
2020-03-09 07:26:40 +08:00
没写过 Dart,但是从你这个例子里看不出来比 Python 优雅的地方
murmur
2020-03-09 07:45:58 +08:00
我认为生产环境写这两种代码都是要被打的
20015jjw
2020-03-09 07:47:52 +08:00
prod 你写个嵌套 list comp 不给你打断
kilasuelika
2020-03-09 07:52:26 +08:00
真要写起来舒服的话,Mathematica 比这两个得好得多。
但调试和查错的时候…………boom
yech1990
2020-03-09 10:10:58 +08:00
@widewing 不是优雅的问题,是设计的“稳健性”。

dart 也可以完全按 Python 那么写,反过来就不行。
Vegetable
2020-03-09 10:29:01 +08:00
你这个 python 他能跑吗?
[if (2 > 1) 222 else 333]不应该是[222 if 2>1 else 333]吗
widewing
2020-03-09 10:34:23 +08:00
@yech1990 你这说法让我想起 Perl.. TMTOWTDI ( There's more than one way to do it )
yech1990
2020-03-09 10:38:35 +08:00
@clockwise9
@noqwerty
@murmur

可能是我没写明白,似乎大家都先入为主地讨论起语言的优雅性的问题,这个 dart 确实口碑不好。

我说的稳健性是指语法在应对用户各色各样的需求的时候,都提前考虑到了,不会触发奇怪的 bug。

再例如 string replacement, dart 里面 'test'.replaceAll 可以支持正则表达式,而 Python 就行,需要另外 import 包来实现。另外 Python 例如 "".replace("", s, n) 这种特例,结果这么多年一直是错的啊,知道最新的 alpha 版才得到修复。。。
yech1990
2020-03-09 10:40:29 +08:00
@Vegetable 复制粘贴出错了,好像帖子改不了。 谢谢指正
yech1990
2020-03-09 10:48:30 +08:00
@widewing 这个确实是个有意思的问题,为了兼容特例会导致实现的多样化。

The zen of Python 里面也提到过这个问题。“Special cases aren't special enough to break the rules.”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/651064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX