У меня начинаются проблемы с 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? Любая помощь?