Issue #12706 has been updated by Eregon (Benoit Daloze).


Does this cause any issue in practice?

AFAIK it's not worth the incompatibility and could break many things.
We had to follow MRI behavior here for Hash#each and Hash#map in TruffleRuby, e.g., https://github.com/oracle/truffleruby/issues/1944

IMHO the right thing to do is to yield 2 values here, and having an Array for backward compatibility if arity != 2 seems OK.

----------------------------------------
Bug #12706: Hash#each yields inconsistent number of args
https://bugs.ruby-lang.org/issues/12706#change-84704

* Author: bughit (bug hit)
* Status: Closed
* Priority: Normal
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
```ruby

def foo(a, b)
  p [a, b]
end

def bar(a, b = 2)
  p [a, b]
end

foo_lambda = method(:foo).to_proc
bar_lambda = method(:bar).to_proc

{a: 1}.each(&foo_lambda)
{a: 1}.each(&bar_lambda)
```

From #12705, yielding to method lambdas uses lambda/method arg semnatics

the yield to foo produces `[:a, 1]` suggesting that each is yielding two values `yield key, value`
but yield to bar produces `[[:a, 1], 2]` suggesting that each is yielding one value `yield [key, value]`

it would be better if you always knew what to expect from it




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>