Aliased method retains super pointer
I noticed an interesting quirk of the alias method. Normally, if we call super from a method, it calls a method with the same name on the super class. However, if we alias a method and then call the new name, it calls the old super method.
For example, lets define a parent and child class. Both have a talk method:
class Parent
def talk
puts "Parent is talking"
end
end
class Child < Parent
def talk
super
end
end
Calling talk on the child calls talk on the Parent:
> c = Child.new
> c.talk
Parent is talking
=> nil
Now, we can modify Child and alias talk to shout:
Child.class_eval do
alias :shout :talk
end
Now, here is the strange part. When we call shout on the child, it still calls talk on the parent, even though the method has a different name:
> c = Child.new
> c.shout
Parent is talking
=> nil
It appears that when we alias a method, it merely copies the super pointer, rather than resolving it on the fly.
However, if we unbind and rebind shout, then the call fails in the expected way:
> shout = Child.instance_method :shout
> shout.bind(c).call
NoMethodError: super: no superclass method `shout'
from (irb):33:in `talk'