[#97678] [Ruby master Feature#16752] :private param for const_set — bughitgithub@...
Issue #16752 has been reported by bughit (bug hit).
5 messages
2020/04/02
[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
From:
v.ondruch@...
Date:
2020-04-16 11:54:13 UTC
List:
ruby-core #97918
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
# => #<Proc:0x000055eecda01510 -e:1>
Hash.new { }.transform_values { }[:any]
# => #<Proc:0x0000563a12e35510 -e:1>
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 <main>': 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: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>