Fix Lazy#flat_map for non-enumerable block return values#6765
Merged
matz merged 2 commits intomruby:masterfrom Mar 29, 2026
Merged
Fix Lazy#flat_map for non-enumerable block return values#6765matz merged 2 commits intomruby:masterfrom
matz merged 2 commits intomruby:masterfrom
Conversation
When the block passed to Lazy#flat_map returns a non-enumerable value (e.g. an Integer), mruby raised NoMethodError because it unconditionally called #each on the result. CRuby yields non-enumerable values directly. Use respond_to?(:each) to match CRuby behavior: iterate enumerable results, yield non-enumerable results as-is.
Contributor
There was a problem hiding this comment.
Code Review
This pull request updates the implementation of Enumerator::Lazy#flat_map to handle block results that are not arrays by checking if the result responds to :each. It also adds new test cases to verify behavior with arrays, non-enumerable objects, and nested enumerables. A review comment suggests improving the clarity of the test descriptions to better distinguish between the different return types being tested.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lazy#flat_mapcrashes withNoMethodErrorwhen the block returns a non-enumerable value, because it unconditionally calls#eachon the result:CRuby handles this by checking whether the result responds to
each-- if it does, iterate it; otherwise yield it directly. This PR matches that behavior and adds tests for arrays, non-enumerables, and nested arrays.