为什么要在 Ceylon 中创建 Iterable 而不是 Sequence?
Why would you create an Iterable instead of a Sequence in Ceylon?
我读过 walkthrough about sequences 但我真的不明白为什么有一种方法可以同时定义文字 Iterable 和文字序列。
{String+} iterable = {"String1", "String2"};
[String+] sequence = ["String1", "String2"];
由于 Sequence 是 Iterable 的子类型,它似乎应该能够完成 Iterable 所做的一切,甚至更多。
那么需要 Iterable 花括号初始化器有什么用呢?您什么时候想使用它而不是方括号序列版本?
流是惰性的。
import ceylon.math.float {random}
value rng = {random()}.cycled;
所以这是一个惰性的、无限的随机数流。构造流时不会调用函数 random
。另一方面,一个序列会急切地计算它的参数,在这种情况下,给你一次又一次的 random
调用的结果。另一个例子:
function prepend<Element>(Element first, {Element*} rest) => {first, *rest};
此处,流 rest
分布在生成的流中,但仅按需分配。
正是@gdejohn 所说的,但我想指出,如果您要对流应用多个操作,惰性对于性能尤为重要,例如:
value stream = { random() }.cycled
.filter((x) => x>0.5)
.map((x) => (x*100).integer);
printAll(stream.take(1000));
这里我们避免 ever 实现长度为 1000 的整个序列,因为每个中间操作:cycled
、filter()
、map()
, 和 take()
returns 一个流。甚至 printAll()
也不需要具体化序列。
我读过 walkthrough about sequences 但我真的不明白为什么有一种方法可以同时定义文字 Iterable 和文字序列。
{String+} iterable = {"String1", "String2"};
[String+] sequence = ["String1", "String2"];
由于 Sequence 是 Iterable 的子类型,它似乎应该能够完成 Iterable 所做的一切,甚至更多。
那么需要 Iterable 花括号初始化器有什么用呢?您什么时候想使用它而不是方括号序列版本?
流是惰性的。
import ceylon.math.float {random}
value rng = {random()}.cycled;
所以这是一个惰性的、无限的随机数流。构造流时不会调用函数 random
。另一方面,一个序列会急切地计算它的参数,在这种情况下,给你一次又一次的 random
调用的结果。另一个例子:
function prepend<Element>(Element first, {Element*} rest) => {first, *rest};
此处,流 rest
分布在生成的流中,但仅按需分配。
正是@gdejohn 所说的,但我想指出,如果您要对流应用多个操作,惰性对于性能尤为重要,例如:
value stream = { random() }.cycled
.filter((x) => x>0.5)
.map((x) => (x*100).integer);
printAll(stream.take(1000));
这里我们避免 ever 实现长度为 1000 的整个序列,因为每个中间操作:cycled
、filter()
、map()
, 和 take()
returns 一个流。甚至 printAll()
也不需要具体化序列。