rubyhashkeyword-argumentruby-2.2double-splat

Keyword arguments unpacking (splat) in Ruby


What is happening below seems a little strange to me.

def f(a, b)
  puts "#{a} :: #{b}"
end

f(*[1, 2], **{}) # prints "1 :: 2"

hash = {}
f(*[1, 2], **hash)
ArgumentError: wrong number of arguments (3 for 2)

f(*[1, 2], **Hash.new)
ArgumentError: wrong number of arguments (3 for 2)

Is this a compiler optimization feature?


Solution

  • That is a Ruby's bug that has been reported several times (for example here by me) but has not been fixed.

    I guess that since the keyword argument feature has been introduced, the double splat syntax has become murky, and that is the indirect cause of this bug. I heard that Matz is considering of introducing a new syntax in some future version of Ruby to distinguish hashes and keyword arguments.