From: "rwstauner (Randy Stauner) via ruby-core" Date: 2026-10-28T18:35:56+00:00 Subject: [ruby-core:127264] [Ruby Bug#21142] Lazy enumerator `.each_with_index` ignores `.take(0)` before it Issue #21142 has been updated by rwstauner (Randy Stauner). @nobu The above commit changed the behavior such that `lazy#each_with_index { ... }` is no longer running the block and just returning the enumerator. 4.0: ``` $ ruby -ve 'arr = []; p 3.times.lazy.each { |*a| arr << a }; p arr;' ruby 4.0.7 (2026-09-15 revision 229531a6cf) +PRISM [x86_64-linux] 3 [[0], [1], [2]] $ ruby -ve 'arr = []; p 3.times.lazy.each_with_index { |*a| arr << a }; p arr;' ruby 4.0.7 (2026-09-15 revision 229531a6cf) +PRISM [x86_64-linux] 3 [[0, 0], [1, 1], [2, 2]] ``` 4.1.0dev: ``` $ ruby -ve 'arr = []; p 3.times.lazy.each { |*a| arr << a }; p arr;' ruby 4.1.0dev (2026-10-28T17:51:51Z master 5127bd0dbc) +PRISM [x86_64-linux] 3 [[0], [1], [2]] $ ruby -ve 'arr = []; p 3.times.lazy.each_with_index { |*a| arr << a }; p arr;' ruby 4.1.0dev (2026-10-28T17:51:51Z master 5127bd0dbc) +PRISM [x86_64-linux] #>:each_with_index(0)> [] ``` This seems inconsistent and likely unintentional. We must be missing tests for this case. ---------------------------------------- Bug #21142: Lazy enumerator `.each_with_index` ignores `.take(0)` before it https://bugs.ruby-lang.org/issues/21142#change-119686 * Author: aaronkison (Aaron Kison) * Status: Closed * ruby -v: 3.2.7 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- Minimum code to produce problem: ``` class Numbers; def each; 100.times { yield _1 }; end; include Enumerable; end Numbers.new.lazy.take(0).each_with_index.map { _1 }.to_a ``` Output (at ruby 3.2.7, and 3.3.0): ``` [0, 1, ..., 99] ``` Expected output (and was as at ruby 3.1.4): ``` [] ``` It works when it opposite ordering: `Numbers.new.lazy.each_with_index.take(0).map { _1 }.to_a`. I suspect it may be related to the change here https://github.com/ruby/ruby/pull/11868/files but I'm not familiar with any of that code. It seems like it replaces an allocated index with a counting index, which my hunch is it works for every value except for 0. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/