Project

General

Profile

Actions

Bug #20440

closed

`super` from child class duplicating a keyword argument as a positional Hash

Added by ozydingo (Andrew Schwartz) 7 months ago. Updated 7 months ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:117624]

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

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0