Actions
Bug #22099
openKeyword-only method silently accepts a positional argument
Bug #22099:
Keyword-only method silently accepts a positional argument
Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.4.9 (2026-03-11 revision 76cca827ab) +PRISM [arm64-darwin24]
Description
A method that declares only keyword parameters accepts a positional argument without raising, but only from the second call onward; a prior valid keyword call to the same method is required to trigger it. Once triggered, the positional value is bound to the first keyword and an explicitly passed keyword of the same name is dropped.
class Foo
def bar(a: nil, b: nil)
p [:body, a: a, b: b]
end
end
foo = Foo.new
foo.bar(a: 1, b: 2) #=> [:body, {a: 1, b: 2}]
foo.bar(99, a: 0) #=> [:body, {a: 99, b: nil}]
foo.bar(99, b: 0) #=> [:body, {a: nil, b: 99}]
Although one positional argument is passed, no exception is raised. The positional value (99) is bound to the first keyword a, and the explicitly passed keyword (a: 0 / b: 0) is not reflected in the result.
Since bar accepts no positional arguments, an ArgumentError (wrong number of arguments (given 1, expected 0)) should be raised.
Actions