рубиновое супер ключевое слово

Из того, что я понимаю, 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

Этот код от ведущего ответвления направляющих. Большое спасибо.

58
задан Ryan Haining 27 June 2013 в 22:16
поделиться

4 ответа

Соответствующим методом суперкласса, вероятно, является Module # autoload .

1
ответ дан 24 November 2019 в 19:03
поделиться

Проверьте objRef.class.ancestors или ClassName.ancestors , чтобы узнать цепочку наследования. Если суперкласс не содержит метода, то проверяются все модули, включенные суперклассом (сначала проверяются последние включенные). Если совпадений нет, то он перемещается на один уровень вверх в класс бабушек и дедушек и так далее.
Вы можете использовать список предков, а затем вызвать AncestorClass.methods.select {| m | m.include? ("auto_load")} , чтобы подключиться к вызываемому методу.

(Примечание: приведенный выше код - Ruby 1.8. В 1.9 методы возвращают символы вместо строк. Так что вам нужно будет выполнить m.to_s.include? (... )

15
ответ дан 24 November 2019 в 19:03
поделиться

Пример, приведенный в документации Ruby для ключевого слова 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]

Обратите внимание на включение объекта Транспортный Модуль !

45
ответ дан 24 November 2019 в 19:03
поделиться

Ключевое слово super полностью проверяет дерево предков, чтобы найти унаследованный метод.

Выполните поиск по всей ветке rails master. Вы найдете только одну def autoload , которая в точности та, что вы смотрите в active_support / lib / active_support / dependencies / autoload.rb .

Переопределяемый метод - это родной Ruby. Это Модуль № автозагрузки

5
ответ дан 24 November 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: