Issue #20064 has been updated by Dan0042 (Daniel DeLorme).
I agree, for several years this topic just keeps popping up, being mentioned by many
people as an odd situation. It's about time that something should be done about it.
For the sake of backward compatibility I think that `**obj` should try #to_hash and then
#to_h. Although in most cases they are the same if they both exist.
On a related topic, `Hash(obj)` doesn't try #to_h and I think it should, similar to
how `Array(obj)` tries both #to_ary and #to_a. I think this is a simple oversight;
probably the behavior of `Hash()` should have been modified at the same time that
`Array#to_h` and others were added in ruby 2.1
----------------------------------------
Bug #20064: Inconsistent behavior between array splat *nil and hash splat **nil
https://bugs.ruby-lang.org/issues/20064#change-105716
* Author: zeke (Zeke Gabrielse)
* Status: Open
* Priority: Normal
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
This has been discussed in #8507 and #9291 but both were closed because they lacked a
clear use case.
I think the following code should work, showing a clear use case:
```ruby
invitation = if params.key?(:inviter_id)
{ invitation_attributes: params.slice(:inviter_id) }
end
User.create(
email: 'john.doe(a)ruby.example'ple',
first_name: 'John',
first_name: 'Doe',
**invitation,
)
```
Per the previous discussions, this is because `*` uses explicit conversion to array
(`to_a`, not `to_ary`), while `**` uses implicit conversion to hash (`to_hash`, not
`to_h`).
I find it confusing that you can splat nil into an array, but not nil into a hash. It
would make sense for `**` to use explicit conversion.
--
https://bugs.ruby-lang.org/