Я изменил ваш пример, чтобы распечатать текущий класс в A#method_1
def method_1(arg)
puts "Using method_1 from class: '#{self.class}' with argument value '#{arg}'"
end
Если вы позвоните B#method_1
, вы получите этот вывод
Using method_1 from class: 'B' with argument value 'foo'
Как вы сказали, он вызывает B#method_1
(что переопределяет A#method_1
). То же самое относится к тому, когда B#method_2
вызывает super
, а затем пытается вызвать self#method_1
, который не принимает аргументов. self
в этом случае имеет тип B
, а B
отменяет method_1
, чтобы не принимать аргументов.
Ruby сначала пытается найти метод в self
и вызывает его, если он найден, в противном случае он просматривает ancestors
этого объекта и вызывает первую версию найденного метода. В вашем случае self
имеет method_1
, который не принимает аргументов, и помните, что Ruby не поддерживает перегрузку методов (если вы не используете необязательные параметры).