Ich lese Sandi Metz's POODR und bin auf ein Codierprinzip gestoßen, das ich nicht ganz verstehe. Hier ist der Code:Kann jemand helfen, den post_initialize Callback für die Klassenerstellung zu erklären (Sandi Metz)
class Bicycle
attr_reader :size, :chain, :tire_size
def initialize(args = {})
@size = args[:size] || 1
@chain = args[:chain] || 2
@tire_size = args[:tire_size] || 3
post_initialize(args)
end
end
class MountainBike < Bicycle
attr_reader :front_shock, :rear_shock
def post_initialize(args)
@front_shock = args[:front_shock]
@rear_shock = args[:rear_shock]
end
end
mb = MountainBike.new(front_shock: 4, rear_shock: 5)
puts mb.size
puts mb.chain
puts mb.tire_size
puts mb.front_shock
puts mb.rear_shock
Dieser Code gibt 1,2,3,4,5
für seine jeweiligen Attribute. Was ich nicht verstehe, ist die Methode nachschlagen.
Wenn ein Mountainbike instanziiert wird, weil es keine eigene initialize
-Methode hat, wird es die Methoden-Lookup-Kette auf seine Super-Klasse (Bicycle
) hochfahren. Aber jetzt scheint es, dass Bicycle dann zurück in MountainBikes Methode post_initialize fährt. Anstatt die Methodenkette fortzusetzen, wie kann sie wieder runter gehen? Ist post_initialize
ein Ruby-Schlüsselwort wie initialize
in dem es eine Art besonderer Funktion dient? Gibt es noch andere Rubin-Introspektionsmethoden, mit denen ich sehen kann, was vor sich geht?
Vielen Dank, Herr Keith. Ich möchte nur hinzufügen, um es explizit klar zu machen - "self" ist der implizite Empfänger, und da die Instanz eine abgeleitete Klasse ist, dann wäre self die abgeleitete Klasseninstanz, die dann auf die relevante Methode zugreifen könnte, die in existieren würde diese bestimmte abgeleitete Klasse (gemäß Jordans Antwort). – BKSpurgeon