Project

General

Profile

Bug #13647

Some weird behaviour with keyword arguments

Added by Arepo (Sasha Cooper) over 2 years ago. Updated 18 days ago.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
2.3.0, 2.4.0
[ruby-core:81637]

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?


Related issues

Related to Ruby master - Feature #14183: "Real" keyword argumentClosedActions

History

#1

Updated by Arepo (Sasha Cooper) over 2 years ago

  • ruby -v set to 2.3.0, 2.4.0

Updated by nobu (Nobuyoshi Nakada) about 2 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 2 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 2 years ago

Just an idea to keep the original argument, if something left.

https://github.com/nobu/ruby/tree/bug/13647-non-hash-rest

#5

Updated by hsbt (Hiroshi SHIBATA) almost 2 years ago

Updated by marcandre (Marc-Andre Lafortune) about 1 year ago

  • Assignee set to matz (Yukihiro Matsumoto)
  • Status changed from Feedback to Open

nobu (Nobuyoshi Nakada) wrote:

Just an idea to keep the original argument, if something left.

https://github.com/nobu/ruby/tree/bug/13647-non-hash-rest

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.

#7

Updated by jeremyevans0 (Jeremy Evans) 18 days 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.

Also available in: Atom PDF