Зачем вам создавать Iterable вместо Sequence на Цейлоне?

Я прочитал пошаговое руководство по последовательностям, но не совсем понимаю, почему существует способ определения как буквального Iterable, так и буквального Sequence.

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

Поскольку Sequence является подтипом Iterable, кажется, что он должен делать все, что делает Iterable, и даже больше.

Зачем тогда нужен инициализатор фигурных скобок Iterable? Когда вы хотели бы использовать его вместо версии Sequence с квадратными скобками?


person KPD    schedule 01.03.2015    source источник


Ответы (2)


Потоки ленивы.

import ceylon.math.float {random}

value rng = {random()}.cycled;

Итак, это ленивый бесконечный поток случайных чисел. Функция random не вызывается при создании потока. С другой стороны, последовательность будет с готовностью оценивать свои аргументы, в этом случае давая вам результат одного вызова random снова и снова. Другой пример:

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

Здесь поток rest распределяется по результирующему потоку, но только по требованию.

person gdejohn    schedule 01.03.2015

Именно то, что сказал @gdejohn, но я хочу отметить, что лень особенно важна для производительности, если вы собираетесь применять к потоку несколько операций, например:

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

Здесь мы избегаем когда-либо материализации целой последовательности длиной 1000, поскольку каждая из промежуточных операций: cycled, filter(), map() и take() возвращает поток. И даже printAll() не нужно материализовать последовательность.

person Gavin King    schedule 01.03.2015
comment
Помимо того, что random() вызывается несколько раз (чего я до сих пор не осознавал), то же самое могло работать и с [...], не так ли? [ 5 ].cycled по-прежнему будет возвращать ленивую итерацию. - person Paŭlo Ebermann; 30.10.2015
comment
Да, [ 5 ].cycled ленив. Он не пытается материализовать бесконечную последовательность :-) - person Gavin King; 30.10.2015