memo.log

技術情報の雑なメモ

Enumerable とか Enumerator のメモ

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ずつ足されてる

note.com