Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Object | enum_for or to_enum

概要

Object#to_enum(method = :each, *args) -> Enumerator
Object#enum_for(method = :each, *args) -> Enumerator
Object#to_enum(method = :each, *args) {|*args| ... } -> Enumerator
Object#enum_for(method = :each, *args) {|*args| ... } -> Enumerator

詳細

Enumerator.new(self, method, *args) を返却。

サンプルコード
class EvenNumbers
  include Enumerable

  def initialize
    @number = 2
  end

  def each
    loop do
      yield(@number)
      @number += 2
    end
  end

  def each_slice_sum(slice_count, limit)
    unless block_given?
      return to_enum(__method__, slice_count, limit) do
        limit
      end
    end
    each_slice(slice_count).with_index do |e, i|
      yield(e.reduce(&:+))
      break if i >= limit
    end
  end
end

even_numbers = EvenNumbers.new
even_enum = even_numbers.enum_for
print even_enum.take(10), "\n"

even_numbers = EvenNumbers.new
even_enum = even_numbers.to_enum
print even_enum.take(10), "\n"

even_numbers = EvenNumbers.new
even_enum = even_numbers.to_enum(:each_slice, 2)
print even_enum.take(5), "\n"

even_numbers = EvenNumbers.new
even_numbers.each_slice_sum(2, 10) { |e|printf("%s,", e) }
puts

even_numbers = EvenNumbers.new
print even_numbers.each_slice_sum(2, 10).size, "\n"

出力

$ ruby object_enum_for.rb
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[[2, 4], [6, 8], [10, 12], [14, 16], [18, 20]]
6,14,22,30,38,46,54,62,70,78,86,
10