Manny_G
Manny_G

Reputation: 333

Ruby enumerator not returning next value

I'm trying to create a generator in Ruby that always returns the next value. For example

def all_numbers
  Enumerator.new do |yielder|
    number = 0
    count = 1
    loop do
      number += count
      count += 1
      yielder.yield number
    end
  end
end

I expect the above code to return

all_numbers.next # 1
all_numbers.next # 2
all_numbers.next # 3
# etc

However, I keep just keeping 1 over and over again.

What am I missing?

Upvotes: 1

Views: 156

Answers (1)

Jörg W Mittag
Jörg W Mittag

Reputation: 369428

Your method returns a new Enumerator every time you call it. So, you never ask for the second element. You create a new Enumerator, ask for its first element, throw the Enumerator away, create a new one, ask for its first element, throw it away, etc.

You need to actually store the Enumerator somewhere and call its next method multiple times:

enum = all_numbers

enum.next #=>   1
enum.next #=>   3
enum.next #=>   6
enum.next #=>  10
enum.next #=>  15
enum.next #=>  21
enum.next #=>  28
enum.next #=>  36
enum.next #=>  45
enum.next #=>  55
enum.next #=>  66
enum.next #=>  78
enum.next #=>  91
enum.next #=> 105
enum.next #=> 120

Upvotes: 4

Related Questions