単一方向の、遅延評価された、潜在的に無限のイテレータの作成に関して、Rubyで歯が生える問題があります。基本的に、私はHaskellリストと、程度は少ないがPythonジェネレーターを使用するのと同じようにRubyを使用しようとしています。
私がそれら自体を理解していないということではありません。他の言語のように気軽に使用する方法がわからないだけでなく、Rubyのどのメソッドがそれらを背後の配列に変換し、シーケンス全体を不必要にメモリにアンロードするかについてもわかりません。
そして、はい、私はRubyリファレンスマニュアルを勉強してきました。実際には30分、注意深く。または、おそらくそうではありません。
たとえば、カードデッキを実装すると、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のchain()など)?無限の範囲のイテレータ(Pythonのcount()など)を生成するにはどうすればよいですか?プロセスですべてを配列に変換せずに、配列をイテレータに追加するにはどうすればよいですか(Pythonのchain()にタプルを渡すなど)。
私は解決策を見てきましたが、それらはアレイまたはファイバーのような不必要な複雑さを含みます。
Pythonでは、配列と同じ単純さでイテレータを操作およびスローできます。私はそれらをHaskellリストのように扱うことができます。これは私が最も快適であり、コーディング時に実際に考えていることです。私はRuby配列に慣れていないので、その代替案について助けを求めています。
私はそれについてインターネット上で情報の塊を拾うことができましたが、Rubyでそのようなデータ構造の基本的な操作をカバーするものを見つけることができませんでしたか?何か助けはありますか?