Bug #18793
closedSelect and Find behave differently for hashes
Description
It seems that Hash implements select but not find, which uses the Enumerable version.
irb(main):009:0> { 1..10 => :a, 11 .. 20 => :b }.select { _1 === 12 }
=> {11..20=>:b}
irb(main):010:0> { 1..10 => :a, 11 .. 20 => :b }.find { _1 === 5 }
=> nil
irb(main):011:0> { 1..10 => :a, 11 .. 20 => :b }.select { p _1 }
1..10
11..20
irb(main):012:0> { 1..10 => :a, 11 .. 20 => :b }.find { p _1 }
[1..10, :a]
Expected Behavior:
I expected that both select and find return matches OR that neither select and find return matches
Current Behavior:
Select returns matches but find does not.
Updated by jeremyevans0 (Jeremy Evans) almost 3 years ago
I don't think this is a bug. The behavior difference is because Hash#each
yields an array of [key, value]
and not key
and value
separately, unlike Hash#select
.
You can get the behavior you want by using explicit block variables:
{ 1..10 => :a, 11 .. 20 => :b }.select { |k,| k === 5 }
{ 1..10 => :a, 11 .. 20 => :b }.find { |k,| k === 5 }
Your code could be made to work by adding a definition for Hash#find
that yields key
and value
separately, but I don't think the backwards compatibility issues with such a change are worth it.
Updated by brenogazzola (Breno Gazzola) almost 3 years ago
Yeah, I had noticed the difference, but I assumed that "method missing = bug". But you are right. That would be a breaking change for a lot of projects (I hand't thought of that).
Updated by jeremyevans0 (Jeremy Evans) almost 3 years ago
- Status changed from Open to Rejected