Итак, я запустил ваш код с некоторыми путами:
class Parent
class << self
def method1
puts "parent.method1; self: #{self.inspect}"
end
def method2
puts "parent.method2 before method1 call; self: #{self.inspect}"
method1
puts "parent.method2 after method1 call"
end
end
end
class Child < Parent
class << self
def method1
puts "child.method1; self: #{self.inspect}"
end
def method2
puts "child.method2 before super; self: #{self.inspect}"
super
puts "child.method2 after super"
end
end
end
Child.method2
и вот что я получил:
выход
child.method2 before super; self: Child
parent.method2 before method1 call; self: Child
child.method1; self: Child
parent.method2 after method1 call
child.method2 after super
Разве это не то, что вы хотели?
Ruby обрабатывает разрешение метода, причем целью всегда является класс объекта. В приведенном выше коде, даже когда вызывается с super, класс все еще дочерний. Поэтому он будет вызывать любой метод, определенный для child, а затем для parent, если он не найден или если child вызывает super ...