Из того, что я понимаю, super
ключевое слово вызывает метод с тем же именем как существующий метод в суперклассе текущего класса. Ниже в autoload
метод, существует вызов к super
. Я хотел бы знать, в котором суперклассе я найду метод с тем же именем или к чему делает вызов super
сделайте здесь
module ActiveSupport
module Autoload
...
def autoload(const_name, path = @@at_path)
full = [self.name, @@under_path, const_name.to_s, path].compact.join("::")
location = path || Inflector.underscore(full)
if @@eager_autoload
@@autoloads[const_name] = location
end
super const_name, location
end
....
end
end
module ActiveRecord
extend ActiveSupport::Autoload
...
autoload :TestCase
autoload :TestFixtures, 'active_record/fixtures'
end
Этот код от ведущего ответвления направляющих. Большое спасибо.
Соответствующим методом суперкласса, вероятно, является Module # autoload .
Проверьте objRef.class.ancestors
или ClassName.ancestors
, чтобы узнать цепочку наследования. Если суперкласс не содержит метода, то проверяются все модули, включенные суперклассом (сначала проверяются последние включенные). Если совпадений нет, то он перемещается на один уровень вверх в класс бабушек и дедушек и так далее.
Вы можете использовать список предков, а затем вызвать AncestorClass.methods.select {| m | m.include? ("auto_load")}
, чтобы подключиться к вызываемому методу.
(Примечание: приведенный выше код - Ruby 1.8. В 1.9 методы
возвращают символы вместо строк. Так что вам нужно будет выполнить m.to_s.include? (...
)
super
: module Vehicular
def move_forward(n)
@position += n
end
end
class Vehicle
include Vehicular # Adds Vehicular to the lookup path
end
class Car < Vehicle
def move_forward(n)
puts "Vrooom!"
super # Calls Vehicular#move_forward
end
end
puts Car.ancestors.inspect
# Output
# [Car, Vehicle, Vehicular, Object, Kernel, BasicObject]
Обратите внимание на включение объекта Транспортный
Модуль
!
Ключевое слово super
полностью проверяет дерево предков, чтобы найти унаследованный метод.
Выполните поиск по всей ветке rails master. Вы найдете только одну def autoload
, которая в точности та, что вы смотрите в active_support / lib / active_support / dependencies / autoload.rb
.
Переопределяемый метод - это родной Ruby. Это Модуль № автозагрузки