super
не вызывает автоматически метод родительского класса.Если вы представляете иерархию наследования класса ruby в виде списка с классом внизу и Object
вверху, когда ruby видит ключевое слово super
, а не просто проверяет родительский класс, он перемещается вверхвесь список, пока не будет найден первый элемент, для которого определен метод с этим именем.
Я осторожно говорю элемент, поскольку это также может быть модуль .Когда вы включаете модуль в класс, он помещается в анонимный суперкласс и помещается над вашим классом в списке, о котором я говорил ранее, так что это означает, что если у вас есть метод, определенный для вашего класса, который также был определен в модуле,тогда вызов super из реализации класса вызовет реализацию модуля, а не родительского класса:
class Foo
def f
puts "Foo"
end
end
module Bar
def f
puts "Bar"
super
end
end
class Foobar < Foo
include Bar
def f
puts "Foobar"
super
end
end
foobar = Foobar.new
foobar.f
# =>
# Foobar
# Bar
# Foo
И я не верю, что этот «список наследования» можно получить из самой среды ruby., что означало бы, что эта функциональность не будет доступна (какой бы полезной она ни была; я не всегда уверен, была ли эта функция предполагаемой).