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
Die relevante Superklassenmethode ist wahrscheinlich Module#autoload .