5

シーケンスに関するウォークスルーを読みましたが、リテラル Iterable とリテラル Sequence の両方を定義する方法がある理由がよくわかりません。

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

Sequence は Iterable のサブタイプであるため、Iterable が行うすべてのこと、およびそれ以上のことを実行できるはずです。

では、Iterable 中括弧イニシャライザを使用する必要は何ですか? 角括弧 Sequence バージョンの代わりにそれを使用したいのはいつですか?

4

2 に答える 2

7

ストリームは怠惰です。

import ceylon.math.float {random}

value rng = {random()}.cycled;

これは怠惰で無限の乱数の流れです。randomストリームを構築するとき、関数は呼び出されません。一方、シーケンスはその引数を熱心に評価します。この場合、何度も 1 回呼び出した結果が得られますrandom。もう一つの例:

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

ここでは、ストリームrestは結果のストリームに分散されますが、オンデマンドでのみです。

于 2015-03-01T03:06:24.517 に答える