V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yech1990
V2EX  ›  Dart

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

  •  
  •   yech1990 · 2020-03-09 02:06:44 +08:00 · 3741 次点击
    这是一个创建于 1480 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • Dart 的一个 List Comprehension 里面可以包含多个“逻辑”
    • “逻辑”的结果可以为空

    这些特性 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]
    )
    
    12 条回复    2020-03-09 10:48:30 +08:00
    widewing
        1
    widewing  
       2020-03-09 03:42:34 +08:00 via Android
    说真的,你真的觉得上面的比下面的舒服吗?
    clockwise9
        2
    clockwise9  
       2020-03-09 07:06:01 +08:00 via Android
    不懂 dart 但是懂一点 python,如果生产环境也这么用的话,会不会难 debug:咦这个函数已经调用过了为啥什么输出都没有?
    noqwerty
        3
    noqwerty  
       2020-03-09 07:26:40 +08:00 via Android
    没写过 Dart,但是从你这个例子里看不出来比 Python 优雅的地方
    murmur
        4
    murmur  
       2020-03-09 07:45:58 +08:00   ❤️ 2
    我认为生产环境写这两种代码都是要被打的
    20015jjw
        5
    20015jjw  
       2020-03-09 07:47:52 +08:00 via Android
    prod 你写个嵌套 list comp 不给你打断
    kilasuelika
        6
    kilasuelika  
       2020-03-09 07:52:26 +08:00 via Android
    真要写起来舒服的话,Mathematica 比这两个得好得多。
    但调试和查错的时候…………boom
    yech1990
        7
    yech1990  
    OP
       2020-03-09 10:10:58 +08:00 via Android
    @widewing 不是优雅的问题,是设计的“稳健性”。

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

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

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

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

    The zen of Python 里面也提到过这个问题。“Special cases aren't special enough to break the rules.”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3238 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:21 · PVG 22:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.