Skip to content

Instantly share code, notes, and snippets.

@avdi
Created January 9, 2015 20:32
Show Gist options
  • Save avdi/d9d92640e570fcba2988 to your computer and use it in GitHub Desktop.
Save avdi/d9d92640e570fcba2988 to your computer and use it in GitHub Desktop.
Behold, the null enumerator.
e = loop
e # => #<Enumerator: main:loop>
e.next # => nil
e.next # => nil
e.peek # => nil
e.size # => Infinity
e.rewind
e.next # => nil
@Peeja
Copy link

Peeja commented Jan 9, 2015

It's certainly useful to have an infinite, constant enumerator, but I think the cases where you want it to be constantly nil are going to be rare.

Incidentally, what's the easiest way to make a constant enumerator, one that always returns, say 5? Off the top of my head, the best I've got is:

Enumerator.new do |y|
  loop do
    y.yield 5
  end
end

but that seems like way too much code for something so fundamental.

Actually, @avdi, loop breaks the consistency a bit because it doesn't yield anything to its block (that is, its block takes arity 0), and so its enumerator should return 0 things each time it's called. But since that doesn't quite make sense, it returns nil.

But if it did somehow return 0 things, this would be a much nicer way to create a constant enumerator:

loop.with_object(5)

Unfortunately, loop.with_object(5).first == [nil, 5].

@avdi
Copy link
Author

avdi commented Jan 9, 2015

Interestingly, @Peeja, at least next_values agrees with you:

e.next_values                   # => []

@AaronLasseigne
Copy link

@Peeja

[5].cycle

@avdi
Copy link
Author

avdi commented Jan 9, 2015

Nice.

@Peeja
Copy link

Peeja commented Jan 12, 2015

@AaronLasseigne Ooh, very nice.

@avdi That's interesting. It's a shame #with_object doesn't use use #next_values. I wonder if Ruby would accept a patch for it…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment