ruby on rails - update - Ruby Super-Keyword




ruby on rails example (4)

Soweit ich weiß, ruft das super Schlüsselwort eine Methode mit demselben Namen auf wie die aktuelle Methode in der Oberklasse der aktuellen Klasse. Unten in der autoload Methode gibt es einen Aufruf an super . Ich würde gerne wissen, in welcher Oberklasse ich eine Methode mit dem gleichen Namen finden würde oder was der Aufruf zu super hier macht

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

Dieser Code stammt aus dem Rails-Master-Zweig. Vielen Dank.

https://code.i-harness.com


Das Beispiel in den Ruby-Dokumenten für das Schlüsselwort 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

Vorfahren untersuchen

puts Car.ancestors.inspect

# Output
# [Car, Vehicle, Vehicular, Object, Kernel, BasicObject]

Beachten Sie die Aufnahme des Vehicular Module Objekts!


Überprüfen Sie objRef.class.ancestors oder ClassName.ancestors , um die Vererbungskette zu kennen. Wenn die Superklasse die Methode nicht enthält, werden alle von der Superklasse eingeschlossenen Module überprüft (zuletzt eingeschlossen, zuerst überprüft). Wenn keine Übereinstimmung vorhanden ist, wird die Ebene um eine Ebene nach oben in die Großelternklasse verschoben.
Sie können die Liste der Vorfahren verwenden und anschließend AncestorClass.methods.select{|m| m.include?("auto_load")} aufrufen AncestorClass.methods.select{|m| m.include?("auto_load")} , um die Methode, die aufgerufen wird, zu AncestorClass.methods.select{|m| m.include?("auto_load")} .

(Anmerkung: Der obige Code ist Ruby 1.8. In 1.9 methods gibt es Symbole anstelle von Strings zurück. Sie m.to_s.include?(... also ein m.to_s.include?(... )


Das Schlüsselwort super überprüft den Stammbaum bis zum Anfang der geerbten Methode.

Führen Sie eine Suche auf dem gesamten Schienenstammzweig durch. Sie werden nur eine active_support/lib/active_support/dependencies/autoload.rb finden, die genau die ist, die Sie in active_support/lib/active_support/dependencies/autoload.rb .

Die Methode, die überschrieben wird, ist nativer Ruby. Es ist Module#autoload






activerecord