Enumerableモジュールの場合
class Test include Enumerable end test = Test.new pp test.respond_to?(:map) # true pp test.respond_to?(:each) # false ####### class AlphabetCollection include Enumerable def initialize @elements = ["a", "b", "c"] end def each @elements.each do |element| # ブロックに各要素を渡してやればよい yield element end end end alphabet_collection= AlphabetCollection.new alphabet_collection.each do |alphabet| p alphabet end test.each_with_index do |e, i| puts "#{i}, #{e}" end
Enumerator の場合
enum = Enumerator.new do |y| "abc".each_byte do |e| # https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aYielder.html#I_--3C--3C # > 生成された Enumerator オブジェクトの each メソッドを呼ぶと Enumerator::Yielder オブジェクトが渡されたブロックが実行され、ブロック内の << が呼ばれるたびに each に渡されたブロックが << に渡された値とともに繰り返されます。 # yield と << は一緒っぽい y.yield e + 10 end end result = enum.map do |e| e end pp result # [107, 108, 109] # 本来の値(abc)よりは10ずつ足されてる