Bug #8815

Enumerable.drop_while returns an Enumerator. Calling next twice on the Enumerator raises StopIteration even if there are still items available

Added by Eric Bouchut 8 months ago. Updated 8 months ago.

[ruby-core:56789]
Status:Rejected
Priority:Normal
Assignee:-
Category:core
Target version:-
ruby -v:ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

I have an enumerable (array) that contains 3 items
[1, 2, 3].
I send dropwhile without a block to this array to get an Enumerator.
enumerator = [1, 2, 3].drop
while

When I call next twice on the Enumerator
enumerator.next # => 1
enumerator.next # => raises StopIteration
The second call enumerator.next raises StopIteration whereas the Enumerable contains more than one item.

I expected the second call to enumerator.next to return 2 instead.

I reproduced this on:
- ruby-1.9.3-p448
- ruby-2.0.0-p247
- rbx-2.0.0
However it works fine in 1.8.7, even if 1.8.7's documentation did not mention about Enumerable.drop_while returning an Enumerator.

Here is an RSpec example that isolates the problem:
http://preview.tinyurl.com/enumerable-drop-while

Eric

History

#1 Updated by Nobuyoshi Nakada 8 months ago

  • Status changed from Open to Rejected

Not a bug.

Enumerable#drop_while stops if the block returns false (or nil).
You have to feed true value to the enumerator by Enumerator#feed.

enumerator.next # => 1
enumerator.feed(true)
enumerator.next # => 2

#2 Updated by James Gray 8 months ago

Isn't that backwards?

>> [1, 2, 3].drop_while { nil }
=> [1, 2, 3]
>> [1, 2, 3].drop_while { false }
=> [1, 2, 3]
>> [1, 2, 3].drop_while { true }
=> []

Also available in: Atom PDF