How to use Enumerator::Generator in Ruby 1.9.2

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. :slight_smile:

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:innew’
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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs