Project

General

Profile

Bug #22273

Updated by luke-gru (Luke Gruber) about 1 month ago

Currently, aliasing doesn't interact well with `Module#prepend` in my opinion. 

 ### Example 

 ```ruby 
 module Kernel 
   prepend(Module.new do 
     def require(feature) 
       puts "requiring feature (prepend): #{feature}" 
       super 
     end 
   end) 
 end 

 module Kernel 
   alias original_require require 
   def require(feature) 
     puts "requiring feature (alias): #{feature}" 
     original_require(feature) 
   end 
 end 

 require "set" 
 ``` 

 This produces this behavior: 

 ``` 
 requiring feature (prepend): set 
 requiring feature (alias): set 
 requiring feature (prepend): set 
 ../ruby/test.rb:5:in 'require': super: no superclass method 'require' for main (NoMethodError) 
 ``` 

 I would expect this behavior: 

 ``` 
 requiring feature (prepend): set 
 requiring feature (alias): set 
 # Then, the original require would succeed 
 ``` 

 This has caused issues such as [22263](https://bugs.ruby-lang.org/issues/22263) and has [confused gem authors](https://github.com/fxn/zeitwerk/pull/203#issuecomment-1107777206). In the second link, the ignored alias was due to [this bug](https://github.com/ruby/ruby/commit/c59c4d717a2e687972341eab1574196e97d7d7be) which has recently been fixed. [22263](https://bugs.ruby-lang.org/issues/22263). 

 ### Bug? 

 As far as I know this is intentional behavior introduced in Ruby 2.0 [here](https://bugs.ruby-lang.org/issues/7842). There are even tests and specs that codify this behavior such as `test_prepend_super_in_alias` and `prepend_spec.rb`. 

 Even though it's intentional, I don't believe it's well thought out. I'm interested in hearing arguments for and against the current behavior (with code examples, preferably).

Back