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).