How to use Enumerator::Generator in Ruby 1.9.2

J

Joey Zhou

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
 
R

Robert Klemme

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
 
J

Joey Zhou

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"?
 
7

7stud --

Joey Zhou 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:

1)
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 `<main>'

2)
obj = Enumerator::Generator.new do |y|
y << 1
end

puts obj.class

--output:--
Enumerator::Generator

There you go.
 
J

Joey Zhou

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?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top