Project

General

Profile

Bug #11068

unable to ommit an optional keyarg if the previous arg is an optional hash

Added by bughit (bug hit) almost 5 years ago. Updated 5 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
[ruby-core:<unknown>]

Description

irb(main):001:0> def foo(hash = {}, a: nil); [hash, a] end
=> :foo
irb(main):002:0> foo({b: 1}, a: 1)
=> [{:b=>1}, 1]
irb(main):003:0> foo({b: 1})
ArgumentError: unknown keyword: b
    from (irb):1:in `foo'
    from (irb):3
    from /home/alex/.rbenv/versions/2.2.2/bin/irb:11:in `<main>'
irb(main):004:0> 

Related issues

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

History

#1

Updated by jeremyevans0 (Jeremy Evans) 7 months ago

Updated by jeremyevans0 (Jeremy Evans) 5 months ago

  • Status changed from Open to Closed

With the acceptance of #14183, this code now emits warnings as the behavior will change in Ruby 3:

foo({b: 1})
# (irb):53: warning: The last argument is used as the keyword parameter
# (irb):51: warning: for `foo' defined here
# ArgumentError (unknown keyword: :b)

In Ruby 3, you will not get a warning, and the code will work as expected. To get the Ruby 3 behavior currently, you can do:

foo({b: 1}, **(;{}))
# => [{:b=>1}, nil]

Also available in: Atom PDF