Hi everybody,
There’s a class called Enumerator::Generator in Ruby 1.9.2, and it seems
to have only one method “#each” of its own.
However the ruby-doc page of Enumerator::Generator is empty, I didn’t
google out the useage of it.
So, can you give me an example how to use this class?
Thank you!
Joey
On Tue, Apr 19, 2011 at 8:43 AM, Joey Z. [email protected] wrote:
Hi everybody,
There’s a class called Enumerator::Generator in Ruby 1.9.2, and it seems
to have only one method “#each” of its own.
However the ruby-doc page of Enumerator::Generator is empty, I didn’t
google out the useage of it.
So, can you give me an example how to use this class?
You can see an example in a recent posting:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/381414
Cheers
robert
On 19.04.2011 09:44, Robert K. wrote:
You can see an example in a recent posting:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/381414
But this can be achieved easier, as e.g. (0…9).cycle already returns an
Enumerator.
ruby-1.9.2-p136 :002 > foo = (0…9).cycle
=> #<Enumerator: 0…9:cycle>
ruby-1.9.2-p136 :003 > foo.next
=> 0
ruby-1.9.2-p136 :004 > foo.take 12
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
ruby-1.9.2-p136 :005 > foo.next
=> 1
ruby-1.9.2-p136 :006 >
e = Enumerator.new do |y|
y << 1
end
p e #=> #<Enumerator: #Enumerator::Generator:0x1345b00:each>
well, it seems that e is an Enumerator, but has an Enumerator::Generator
in it. I am confused what on earth Enumerator::Generator is. Can I get
an object that can return “Enumerator::Generator” if I type “obj.class”?
On Tue, Apr 19, 2011 at 12:55 PM, Johannes Held
[email protected] wrote:
On 19.04.2011 09:44, Robert K. wrote:
You can see an example in a recent posting:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/381414
But this can be achieved easier, as e.g. (0…9).cycle already returns an
Enumerator.
Yes, but please note that #cycle was not used in the example posted by
me which I was referring to. Any simple example can usually be solved
with another approach than Enumerator so I guess most examples which
are good for conveying functionality of Enumerator.new will suffer
from that very same issue. 
Kind regards
robert
May I think like this, Enumerator.new is a short way, including two
steps:
eg = Enumerator::Generator.new {|y| y << 1 }
p eg # #Enumerator::Generator:0xb44890
e1 = Enumerator.new(eg)
p e1 # #<Enumerator: #Enumerator::Generator:0xb44890:each>
e2 = eg.to_enum
p e2 # #<Enumerator: #Enumerator::Generator:0xb44890:each>
so ruby-doc says there are two forms of Enumerator.new:
Enumerator.new(obj, method = :each, *args)
Enumerator.new { |y| … }
in fact, there’s just one, the second one can be regarded as
Enumerator.new(enum_generator_instance)
Does Enumerator::Generator exist, because Ruby 1.8 has a Generator
class?
Joey Z. wrote in post #993744:
e = Enumerator.new do |y|
y << 1
end
p e #=> #<Enumerator: #Enumerator::Generator:0x1345b00:each>
well, it seems that e is an Enumerator, but has an Enumerator::Generator
in it. I am confused what on earth Enumerator::Generator is.
It’s that y thing, and it knows how to provide values to the enumerator
when your code requests values from the enumerator.
Can I get
an object that can return “Enumerator::Generator” if I type “obj.class”?
Let’s see:
-
obj = Enumerator::Generator.new
puts obj.class
–output:–
prog.rb:1:in initialize': no block given (LocalJumpError) from prog.rb:1:in
new’
from prog.rb:1:in `’
-
obj = Enumerator::Generator.new do |y|
y << 1
end
puts obj.class
–output:–
Enumerator::Generator
There you go.
and it seems
to have only one method “#each” of its own.
Let’s see if it works:
obj.each do |val|
puts val
end
–output:–
1
Voila!
However, it’s not clear why using Enumerator::Generator on its own helps
you solve some kind of problem. Lots of classes have helper methods,
and it shouldn’t be a stretch of the imagination to realize that a class
might create a helper object.