Project

General

Profile

Actions

Bug #8316

closed

Can't pass hash to first positional argument; hash interpreted as keyword arguments

Added by TylerRick (Tyler Rick) over 11 years ago. Updated over 6 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin13]
Backport:
[ruby-core:54535]

Description

I'm able to pass any other type of object to my first argument:

def foo(hash, opt: true)
puts "hash: #{hash}, opt: #{opt.inspect}"
end

foo 'a' # => hash: a, opt: true
foo [{a:1}] # => hash: [{:a=>1}], opt: true
foo [{a:1}], opt: false # => hash: [{:a=>1}], opt: false

But when I try to pass a hash, it raises an ArgumentError:

foo({a:1}) # Raises ArgumentError: unknown keyword: a

Expected behavior: hash: {:a=>1}, opt: true

I tried to work around the "unknown keyword" error by using ** but ended up getting a "wrong number of arguments (0 for 1)" error instead.

def foo_with_extra(hash, **extra)
puts "hash: #{hash}, extra: #{extra.inspect}"
end

foo_with_extra 'a' # hash: a, extra: {}
foo_with_extra [{a:1}] # hash: [{:a=>1}], extra: {}
foo_with_extra [{a:1}], opt: false # hash: [{:a=>1}], extra: {:opt=>false}

foo_with_extra({a:1}) # Raises ArgumentError: wrong number of arguments (0 for 1)

Expected behavior: hash: {:a=>1}, extra: {}

This behavior is surprising and I haven't seen it mentioned anywhere before. Is it really intentional?


Related issues 2 (0 open2 closed)

Related to Ruby master - Feature #14183: "Real" keyword argumentClosedActions
Is duplicate of Backport200 - Backport #8040: Unexpect behavior when using keyword argumentsClosednagachika (Tomoyuki Chikanaga)03/08/2013Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0