【问题标题】:Why would you create an Iterable instead of a Sequence in Ceylon?为什么要在 Ceylon 创建 Iterable 而不是 Sequence?
【发布时间】:2015-03-01 18:39:11
【问题描述】:

我已经阅读了walkthrough about sequences,但我真的不明白为什么有一种方法可以同时定义文字 Iterable 和文字序列。

{String+} iterable = {"String1", "String2"};
[String+] sequence = ["String1", "String2"];

由于 Sequence 是 Iterable 的子类型,它似乎应该能够完成 Iterable 所做的一切,甚至更多。

那么,拥有 Iterable 花括号初始化器的必要性是什么?你什么时候想用它来代替方括号序列版本?

【问题讨论】:

    标签: ceylon


    【解决方案1】:

    流是惰性的。

    import ceylon.math.float {random}
    
    value rng = {random()}.cycled;
    

    所以这是一个懒惰的、无限的随机数流。构造流时不会调用函数random。另一方面,一个序列会急切地评估它的参数,在这种情况下,会一遍又一遍地给你一次调用random 的结果。另一个例子:

    function prepend<Element>(Element first, {Element*} rest) => {first, *rest};
    

    在这里,rest 流分布在生成的流上,但仅按需提供。

    【讨论】:

      【解决方案2】:

      正如@gdejohn 所说,但我想指出,如果您要对流应用多个操作,则延迟对于性能尤为重要,例如:

      value stream = { random() }.cycled
              .filter((x) => x>0.5)
              .map((x) => (x*100).integer);
      printAll(stream.take(1000));
      

      这里我们避免永远实现长度为 1000 的整个序列,因为每个中间操作:cycledfilter()map()take() 返回一个流。甚至printAll() 也不需要具体化一个序列。

      【讨论】:

      • 除了多次调用random() 的东西(直到现在我还没有意识到)之外,[...] 也是如此,不是吗? [ 5 ].cycled 仍然会返回一个惰性迭代器。
      • 是的,[ 5 ].cycled 很懒惰。它不会尝试实现无限序列:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2011-08-23
      • 2011-07-24
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多