Actions
Bug #12106
closedBehavior of double splatting of hashes with non symbol key is different according to splatted hash position
Description
When doing double splatting with hash with non symbols keys you get different behaviors according to the position of the hash been splatted:
{a: 3, **{b: 1}, **{'b' => 1}} # Works fine
{a: 3, **{1 => 1}, **{b: 1}} # Works fine
{3 => 3, **{b: 1}, **{'b' => 1}} # Works fine
{**{}, a: 3, **{b: 1}, **{1 => 1}} # Works fine
{**{b: 1}, a: 3, **{1 => 1}} # TypeError: wrong argument type Fixnum (expected Symbol)
{**{'b' => 1}, **{c: 4}} # TypeError: wrong argument type Fixnum (expected Symbol)
{**{c: 4}, **{'b' => 1}} # TypeError: wrong argument type Fixnum (expected Symbol)
{**{c: 4}, a: 3, **{'b' => 1}} # TypeError: wrong argument type Fixnum (expected Symbol)
Same thing happens when you double splat inside a message send:
puts(a: 3, **{b: 1}, **{'b' => 1}) # Works fine
puts(a: 3, **{1 => 1}, **{b: 1}) # Works fine
puts(3 => 3, **{b: 1}, **{'b' => 1}) # Works fine
puts(**{}, a: 3, **{b: 1}, **{1 => 1}) # Works fine
puts(**{b: 1}, a: 3, **{1 => 1}) # TypeError: wrong argument type Fixnum (expected Symbol)
puts(**{'b' => 1}, **{c: 4}) # TypeError: wrong argument type Fixnum (expected Symbol)
puts(**{c: 4}, **{'b' => 1}) # TypeError: wrong argument type Fixnum (expected Symbol)
puts(**{c: 4}, a: 3, **{'b' => 1}) # TypeError: wrong argument type Fixnum (expected Symbol)
What's basically going on is this: you can double splat hashes with no symbol keys all you want, only if the first value of the hash is a regular key (symbol or not) and not a splatted hash, or also a double splatted empty hash.
It feels strange that building the same hash in different orders yields so different behaviors.
Anyhow, I personally feel it should be a bug if you cannot splat a hash with no symbol keys into another one, whichever are the remaining values of the hash.
Actions
Like0
Like0Like0Like0