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
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