SyncEnumerator

rucilaさんの日記を見て、enumeratorという単語で調べていたら、SyncEnumeratorというクラスを発見しました。何が'sync'なのだろうと思いましたが、require 'generator'を見つけて納得です。

require 'generator'

enumerator = SyncEnumerator.new(["A", "B", "C"], [10, 20, 30])
enumerator.each do |a|
  p a
end

実行結果です。

["A", 10]
["B", 20]
["C", 30]

つまりは、二つのEnumerableオブジェクトを同期させてeachで回せるということですね。
ん? ということは、こうすれば…

require 'generator'

enumerator = SyncEnumerator.new(DATA, [10, 20, 30])
enumerator.each do |a|
  p a
end
__END__
Alice
Bob
Chris

実行結果です。

["Alice\n", 10]
["Bob\n", 20]
["Chris\n", 30]

すばらしい♪ インタフェース(含むMix-in)でプログラミングすることの強力さを感じます。
追記:かずひこさんから、Enumerable#zipを教えていただきました。ありがとうございます。そういえば、Haskellにもzipがあったような。ジッパーを閉じる感覚ですね。