From: "jeremyevans0 (Jeremy Evans) via ruby-core" Date: 2024-09-07T00:00:44+00:00 Subject: [ruby-core:119094] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x Issue #20716 has been updated by jeremyevans0 (Jeremy Evans). This behavior isn't related to `instance_method`. It occurs in the following code: ```ruby module A def test(*args) super end end module B def test(a) puts a end end class C; end B.prepend(A) C.include(B) C.new.test 1 module B def test puts 'lambda' end end C.new.test ``` It also happens when you replace `C.include(B)` with `C.prepend(B)`. It does not happen when you replace `B.prepend(A); C.include(B)` with `A.include(B); C.include(A)`. It also does not happen if a class directly prepends a module, such as in this example: ```ruby module A def test(*args) super end end class B def test(a) puts a end end B.prepend(A) B.new.test 1 class B def test puts 'lambda' end end B.new.test ``` It seems like the conditions are: * Class includes or prepends module X that prepends module Y * Both X and Y define method M * Y's definition of M calls `super` * X's definition of M is overridden after `super` method call is cached ---------------------------------------- Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x https://bugs.ruby-lang.org/issues/20716#change-109681 * Author: natton (Tien Truong) * Status: Open * ruby -v: 3.3.1 * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- 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] -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/