It seems like using "peek" and then calling other methods on the Enumerator consumes the value that was peeked at. While next correctly returns the peeked-at value the next time it is called, other Enumerator methods such as to_a and each do not.

Here the final call to enum.to_a should have returned ["foo"], since we have not consumed anything from the enumerator yet. The peeked-at value is not included in the returned Array.

Taking a glance at the code, it seems that these methods do not call next under the hood, but instead have some other mechanism of iterating over the Enumerator, this seems very counter-intuitive to me.