Project

General

Profile

Actions

Bug #20623

open

Unexpected behavior of blocks in Enumerator::Lazy#zip

Added by esad (Esad Hajdarevic) 8 days ago. Updated 7 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:118529]

Description

I've stumbled upon unexpected behaviour of lazy enumerators. My example:

[1].cycle.lazy.zip([2].cycle.lazy).map do |x|
  puts x.inspect
end.take(5).force
puts "---"
[1].cycle.lazy.zip([2].cycle.lazy).take(5).force.map do |x|
  puts x.inspect
end

The outputs (and variable assignment inside the block) differs

1
1
1
1
1
---
[1, 2]
[1, 2]
[1, 2]
[1, 2]
[1, 2]
Actions #1

Updated by esad (Esad Hajdarevic) 8 days ago

  • Subject changed from Unexpected behavior of blocks in LazyEnumerator#map to Unexpected behavior of blocks in LazyEnumerator#zip
Actions #2

Updated by esad (Esad Hajdarevic) 8 days ago

  • Subject changed from Unexpected behavior of blocks in LazyEnumerator#zip to Unexpected behavior of blocks in Enumerator::Lazy#zip

Updated by eileencodes (Eileen Uchitelle) 7 days ago

I tested this against a few versions of Ruby. In 2.7.x the first example returns [1,2]. But since 3.0.x it returns 1. It also seems cycle isn't needed to reproduce it, so I removed that from the reproduction script. I wasn't able to get it any smaller, as lazy and force (or to_a) is required.

[1].lazy.zip([2].lazy).map do |x| 
  puts x.inspect
end.take(5).force

puts "---"

[1].lazy.zip([2].lazy).take(5).force.map do |x| 
  puts x.inspect
end
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0