Object # to_enum ( , Object#enum_for) , :
obj.to_enum(method = :each, *args)
" Enumerator, , method obj, args, . Object, , , each :
enum = 1.to_enum
enum.each { |i| puts "i" }
#NoMethodError: undefined method `each' for 1:Fixnum
to_enum, :each, :
obj.to_enum
, obj . :each, , self, main.
enum, each , enum ( ) .
, :
a = [1,2,3]
enum = a.to_enum
enum.to_a
enum.each { |e| puts e }
a[0] = 'cat'
enum.to_a
a.object_id
a = []
a.object_id
enum.to_a
a = [1,2,3]
enum = a.to_enum
a.replace([])
enum.to_a
, #=>, , , #->, , .
loop do
, :
enum = [1,2,3].to_enum
enum, Enumerator # next :
enum.next #=> 1
enum.next #=> 2
enum.next #=> 3
enum.next #=> StopIteration: iteration reached an end
enum.rewind
enum.next #=> 1
, StopIteration , .
a > , loop StopIteration, . :
enum = [1,2,3].to_enum
loop do
puts enum.next
end
#-> 1
# 2
# 3
#=> nil
names ,
, , , @names ( "" ). :
def names
yield "Lucy"
s = "Billy-Bob"
yield s
end
, :
def names
yield "Lucy"
s = "Billy-Bob"
yield s
end
names { |s| puts "My name is #{s}" }
:
enum = to_enum(:names)
, Enumerator # next:
enum.next #=> "Lucy"
enum.next #=> "Billy-Bob"
enum.next #=> StopIteration: iteration reached an end (exception)
, ? Ruby names , yield.
each enum , :
enum.each { |s| puts "My name is #{s}" }
each enum .
names,
, .
@names = %w[Ylva Brighid Shifra Yesamin]
def names
yield @names.shift
yield @names.shift
yield @names.shift
yield @names.shift
end
, names :
names { |s| puts "My name is #{s}" }
:
@names
@names:
@names = %w[Ylva Brighid Shifra Yesamin]
names:
enum = to_enum(:names)
next @names:
enum.next # => @names.shift => "Ylva"
# => "Ylva"
next Ruby yield names , . : `
@names #=> ["Brighid", "Shifra", "Yesamin"]
:
enum.next #=> "Brighid"
@names #=> ["Shifra", "Yesamin"]
enum.next #=> "Shifra"
@names #=> ["Yesamin"]
enum.next #=> "Yesamin"
@names #=> []
:
enum.next
, , -, :
enum.to_a
#=> [nil, nil, nil, nil]
, :
[][0]
[][1]
[][999]
each enum , :
@names = %w[Ylva Brighid Shifra Yesamin]
enum.each { |s| puts "My name is #{s}" }
, , @names, , ?