Ruby: манипулирование итераторами?

У меня начинаются проблемы с Ruby, что касается создания однонаправленных, лениво вычисляемых, потенциально бесконечных итераторов. По сути, я пытаюсь использовать Ruby, как списки Haskell и, в меньшей степени, генераторы Python.

Дело не в том, что я не понимаю их как таковых; Я просто не знаю, как использовать их так же небрежно, как другие языки, и я также не уверен, какие методы в Ruby превратят их в массивы за моей спиной, без необходимости выгружая всю последовательность в память.

И да, Я изучал справочное руководство по Ruby. Собственно, на полчаса внимательно. Или, возможно, очевидно, нет.

Например, если бы я реализовал колоду карт, она бы выглядела примерно так в Python (непроверено):

# Python 3

from itertools import chain, count

face_ranks =
    dict(
        zip(
            ('jack', 'queen', 'king', 'ace'),
            count(11)))

sorted_deck =
    map(
        lambda suit:
            map(
                lambda rank:
                    {
                        'rank' : rank,
                        'suit' : suit
                    },
                chain(
                    range(2, 11),
                    face_ranks.keys())),
        ('clubs', 'diamonds', 'hearts', 'spades'))

Итак, как бы я сделал это в Ruby, полностью избегая массивов? Обратите внимание, что в приведенном выше коде, насколько мне известно, используются только кортежи и генераторы: ни в коем случае не вся последовательность выгружается в память, как если бы я использовал массив. Я могу ошибаться насчет приведенного выше кода, но вы получаете то, что я хочу.

Как связать итераторы (например, цепочку Python ())? Как мне создать итератор бесконечного диапазона (например, Python count ())? Как я могу добавить массив к итератору (например, передать кортеж в цепочку Python ()) без преобразования всего этого в массив в процессе?

Я видел решения, но они включают массивы или ненужные сложности, такие как волокна .

В Python я могу управлять итераторами с той же простотой, что и массивы. Я могу относиться к ним почти как к спискам Haskell, с которыми мне удобнее всего, и это действительно то, о чем я думаю при кодировании. Меня не устраивают массивы Ruby, поэтому я обращаюсь за помощью с их альтернативой (-ами).

Мне удалось найти в Интернете обрывки информации о нем, но я не смог найти ни одного, что покрывает основные манипуляции с такими структурами данных в Ruby? Любая помощь?

6
задан Jota 30 June 2015 в 23:00
поделиться