你为什么要在锡兰创造一个Iterable而不是一个序列?

KPD*_*KPD 5 ceylon

我已经阅读了有关序列演练,但我真的不明白为什么有一种方法来定义文字Iterable和文字序列.

{String+} iterable = {"String1", "String2"};
[String+] sequence = ["String1", "String2"];
Run Code Online (Sandbox Code Playgroud)

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

那么拥有Iterable花括号初始化程序需要什么呢?你想什么时候使用它而不是方括号序列版?

gde*_*ohn 7

流是懒惰的.

import ceylon.math.float {random}

value rng = {random()}.cycled;
Run Code Online (Sandbox Code Playgroud)

所以这是一个懒惰,无限的随机数流.random构造流时不会调用该函数.另一方面,序列会急切地评估它的参数,在这种情况下,为您提供一次性调用的结果random.另一个例子:

function prepend<Element>(Element first, {Element*} rest) => {first, *rest};
Run Code Online (Sandbox Code Playgroud)

这里,流rest分布在结果流上,但仅在需要时.


Gav*_*ing 5

正是@gdejohn所说的,但我想指出,如果你要对流应用多个操作,懒惰对性能尤其重要,例如:

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

在这里,我们避免以往物化长度1000的整个序列,由于中间业务的每一个:cycled,filter(),map(),和take()返回流.甚至printAll()不需要实现序列.