Actions
Bug #20440
closed`super` from child class duplicating a keyword argument as a positional Hash
Description
Apologies for the verbose title, but that's the specific set of conditions that AFAICT are required to reproduce the bug!
Here's the simplest setup I can reproduce:
class Base
def foo(*args, x: 1)
puts "Base: calling foo with args: #{args}, x: #{x}"
end
def foo!(x: 1)
puts "Base: calling foo! with x: #{x}"
foo(x: x)
end
end
class Child < Base
def foo(*)
puts "Child: calling foo"
super
end
end
When I call Child.new.foo!
, I expect it to call the base class method foo!
, which will use the default keyword arg x: 1
; then the child method foo
with x: 1
, and finally the base method foo
with x: 1
. However, this is not what I observe:
Child.new.foo!
Base: calling foo! with x: 1
Child: calling foo
Base: calling foo with args: [{:x=>1}], x: 1
So when the child foo
method called super
, it passed not only x: 1
as a keyword arg, but also {x: 1}
as a Hash positional arg to the super method.
This is breaking my upgrade to Ruby 3.0 as I have a similar setup but without the *args
param, this I am getting the error "wrong number of arguments (given 1, expected 0)".
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0