Bug #13647
closedSome weird behaviour with keyword arguments
Description
I was just playing around and found this weird behaviour, which seems to be in at least Ruby 2.3.0 and Ruby 2.4.0:
hashie = Hashie::Mash.new(a: :b)
def foo(hashie)
hashie.inspect
end
def woo(hashie, bashie: nil)
hashie.inspect
end
def zoo(hashie = nil, cashie: nil)
hashie.inspect
end
foo(hashie) # => "#<Hashie::Mash a=:b>"
woo(hashie) # => "#<Hashie::Mash a=:b>"
So far so good, but when we call the third method, we get this:
zoo(hashie) # => "{\"a\"=>:b}"
Similarly,
zoo(:symbol) # => ":symbol"
Is this intentional behaviour? If so, what's the rationale? If not, is it a known issue?
Updated by nobu (Nobuyoshi Nakada) over 7 years ago
- Status changed from Open to Feedback
I couldn't reproduce it with hashie-3.5.6, from 2.0.0 through trunk.
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
After the previous developers' meeting, Matz said an idea to restrict it to only T_HASH
and not to call to_hash
method, but it breaks mocks in rubyspec so much.
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
Just an idea to keep the original argument, if something left.
Updated by hsbt (Hiroshi SHIBATA) almost 7 years ago
- Related to Feature #14183: "Real" keyword argument added
Updated by marcandre (Marc-Andre Lafortune) about 6 years ago
- Status changed from Feedback to Open
- Assignee set to matz (Yukihiro Matsumoto)
nobu (Nobuyoshi Nakada) wrote:
Just an idea to keep the original argument, if something left.
I agree that if the conversion of a hash-like argument to keyword parameter fails because the keys aren't all symbols, the original object should be passed.
I would do this without waiting for final decision on if to_hash
is acceptable for keyword arguments or not, since even if it is decided to change so that to_hash
isn't sufficient, the new behavior will be to receive the original object.
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Status changed from Open to Closed
In all released versions of Ruby I tested, zoo(hashie)
raises ArgumentError
.
With the changes in #14183, in the master branch, you also get a warning notifying you of the upcoming behavior change:
zoo(hashie)
# file.rb: warning: The last argument for `zoo' (defined at file.rb:14) is used as the keyword parameter
# file.rb:14:in `zoo': unknown keyword: :a (ArgumentError)
In Ruby 3, the behavior for zoo
will be the same as foo
and woo
.