From: v.ondruch@... Date: 2020-04-16T11:54:13+00:00 Subject: [ruby-core:97918] [Ruby master Bug#16498] Hash#transform_values in 2.7.0 sets new hash's default to old hash's default_proc Issue #16498 has been updated by vo.x (Vit Ondruch). Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED This does break ActiveSupport 5.2 test suite. ---------------------------------------- Bug #16498: Hash#transform_values in 2.7.0 sets new hash's default to old hash's default_proc https://bugs.ruby-lang.org/issues/16498#change-85142 * Author: ptsengineer (Peter Tsengineer) * Status: Closed * Priority: Normal * ruby -v: ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED ---------------------------------------- The following is unexpected for me. ```ruby Hash.new { }.transform_values { }.default # => # Hash.new { }.transform_values { }[:any] # => # Hash.new { :default }.transform_values { }[:any][] # => :default ``` I did not think a `default_proc` would turn into a default. The previous behaviour in 2.6 was that the default would be `nil`, so this is new in 2.7. But I didn't see this mentioned in the 2.7 NEWS. May I learn of the proper use for this and/or whether it is intentional? If you wonder when we might see something like this, I had found it with code similar in idea to the following: ```ruby weights = Hash.new { |h, k| h[k] = [] } weights[:apple] << 1 weights[:apple] << 2 prices = weights.transform_values { :arbitrary } puts (prices[:mango] || [])[0] || "We're all out of mangoes today" ``` ``` in `block in
': undefined method `[]=' for 0:Integer (NoMethodError) ``` That was quite a confusing error message. It took a while to realise why `[]=` was called on `0`. We also cannot fix this by using `dig` (`puts prices.dig(:mango, 0) || "We're all out of mangoes today"`) because then, we would get: ``` in `dig': Proc does not have #dig method (TypeError) ``` -- https://bugs.ruby-lang.org/ Unsubscribe: