Project

General

Profile

Actions

Bug #20716

closed

Different instance_method behavior in Ruby 2.7 and Ruby 3.x

Added by natton (Tien Truong) 2 months ago. Updated about 8 hours ago.

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

Description

Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in instance_method behavior.
Here is the code snippet

module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)

I don't know if this is a bug or a correct intention.

My specs:

  • Ruby manager: rbenv
  • Tested on
    • ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    • ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    • ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    • ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    • ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]
Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1Like0Like0Like0