Project

General

Profile

Bug #12717

Optional argument treated as kwarg

Added by AMHOL (Andy Holland) over 2 years ago. Updated 9 months ago.

Status:
Open
Priority:
Normal
Target version:
-
[ruby-core:77121]

Description

When you define a method with an optional argument and keyword arguments (whether explicitly or with options splat) the defaulted argument can not take a hash argument, instead it is interpreted as keyword arguments:

class Foo
  def self.options(value = nil, **options)
    puts value.inspect
    puts options.inspect
  end

  def self.kwarg(value = nil, kw: nil)
    puts value.inspect
    puts kw.inspect
  end

  def self.splat(*args, kw: nil)
    puts args.inspect
    puts kw.inspect
  end
end

Foo.options({})
# nil
# {}
Foo.kwarg({})
# nil
# nil
Foo.splat({})
# []
# nil

Foo.options({ key: :value })
# nil
# {:key=>:value}
Foo.kwarg({ key: :value })
# ArgumentError: unknown keyword: key
Foo.splat({ key: :value })
# ArgumentError: unknown keyword: key

I would expect the output to be:

Foo.options({})
# {}
# {}
Foo.kwarg({})
# {}
# nil
Foo.splat({})
# [{}]
# nil

Foo.options({ key: :value })
# {:key=>:value}
# {}
Foo.kwarg({ key: :value })
# {:key=>:value}
# nil
Foo.splat({ key: :value })
# [{:key=>:value}]
# nil

Related issues

Related to Ruby trunk - Feature #14183: "Real" keyword argumentOpenActions
Has duplicate Ruby trunk - Bug #13336: Default Parameters don't workClosedActions

History

#1

Updated by hsbt (Hiroshi SHIBATA) over 1 year ago

Updated by marcandre (Marc-Andre Lafortune) 9 months ago

I believe this is as designed.

As I stated previously (https://bugs.ruby-lang.org/issues/11967#note-3), my understanding is that:

  • after all mandatory unnamed arguments are filled
  • if the last remaining argument is hash-like
  • and all its keys are symbols
  • and the method called uses keyword arguments => then that parameter is used for keyword arguments.

I believe we should close this issue.

#3

Updated by marcandre (Marc-Andre Lafortune) 9 months ago

  • Has duplicate Bug #13336: Default Parameters don't work added

Also available in: Atom PDF