to_enum(method = :each, *args) -> Enumerator[permalink][rdoc]enum_for(method = :each, *args) -> Enumeratorto_enum(method = :each, *args) {|*args| ... } -> Enumeratorenum_for(method = :each, *args) {|*args| ... } -> EnumeratorEnumerator.new(self, method, *args) を返します。
ブロックを指定した場合は Enumerator#size がブロックの評価結果を返します。ブロックパラメータは引数 args です。
str = "xyz"
enum = str.enum_for(:each_byte)
p(a = enum.map{|b| '%02x' % b }) #=> ["78", "79", "7a"]
# protects an array from being modified
a = [1, 2, 3]
p(a.to_enum) #=> #<Enumerator: [1, 2, 3]:each>
例(ブロックを指定する場合):
module Enumerable
  def repeat(n)
    raise ArgumentError, "#{n} is negative!" if n < 0
    unless block_given?
      # __method__ はここでは :repeat
      return to_enum(__method__, n) do
        # size メソッドが nil でなければ size * n を返す。
        sz = size
        sz * n if sz
      end
    end
    each do |*val|
      n.times { yield *val }
    end
  end
end
%i[hello world].repeat(2) { |w| puts w }
# => 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
# => #<Enumerator: 1..14:repeat(3)>
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
[SEE_ALSO] Enumerator, Enumerator#size