Project

General

Profile

Actions

Bug #6142

closed

Enumerable::Lazy#zip doesn't rewind internal enumerators

Added by gregolsen (Innokenty Mikhailov) over 12 years ago. Updated almost 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.0.0dev (2012-03-14 trunk 35013) [x86_64-linux]
Backport:
[ruby-core:43273]

Description

All enumerables passed to Enumerable::Lazy#zip are converted into lazy enumerators.
When result evaluated - ruby iterates over this enumerators while calling #next to retrieve the next value.
But those enumerators are not rewinded:

a = (1..3).lazy.zip('a'..'z')
a.to_a #=> [[1, "a"], [2, "b"], [3, "c"]]
a.to_a #=> [[1, "d"], [2, "e"], [3, "f"]]

I believe that is not the desired behavior here and a.to_a should always return the same value.


Files

lazy_zip_to_a.diff (1.14 KB) lazy_zip_to_a.diff shugo (Shugo Maeda), 03/16/2012 12:03 PM

Updated by trans (Thomas Sawyer) over 12 years ago

A touch OT, but is Brian Candler being involved in the development of this? I don't know of anyone who has discussed and worked on this topic more over the years than Brian and I think it would be most prudent to seek his consul on these matters.

(Not to speak for Brain, of course, but just saying.)

Updated by shugo (Shugo Maeda) over 12 years ago

Innokenty Mikhailov wrote:

a = (1..3).lazy.zip('a'..'z')
a.to_a #=> [[1, "a"], [2, "b"], [3, "c"]]
a.to_a #=> [[1, "d"], [2, "e"], [3, "f"]]

I believe that is not the desired behavior here and a.to_a should always return the same value.

I agree that the current behavior is confusing, and the attached patch fixes it in the above case, but the patch cannot fix it in the following case:

a = (1..3).lazy.zip('a'..'z').map {|i| i.join(":")}
p a.to_a #=> ["1:a", "2:b", "3:c"]
p a.to_a #=> ["1:d", "2:e", "3:f"]

It may be difficult to fix it without performance decrease.
We have three options:

(1) Keep the current behavior.
(2) Rewind enumerators only when to_a is directly invoked on the lazy enumerator returned by lazy.zip.
(3) Rewind enumerators even if to_a is invoked on a chained enumerator. This may cause performance decrease.

Updated by shugo (Shugo Maeda) over 12 years ago

Thomas Sawyer wrote:

A touch OT, but is Brian Candler being involved in the development of this? I don't know of anyone who has discussed and worked on this topic more over the years than Brian and I think it would be most prudent to seek his consul on these matters.

Any comments from Brian and others are welcome.
If there is something wrong with the current behavior, please file a ticket or send a mail to ruby-core.

Updated by shugo (Shugo Maeda) over 12 years ago

  • Status changed from Open to Feedback
  • Assignee set to shugo (Shugo Maeda)

Updated by shugo (Shugo Maeda) almost 12 years ago

  • Status changed from Feedback to Closed

This issue should be discussed in #7691 and #7696.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0