Sto leggendo il POODR di Sandi Metz e ho trovato un principio di codifica che non capisco. Ecco il codice:Qualcuno può aiutare a spiegare il callback post_initialize per la creazione di classi (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
Questo codice emette 1,2,3,4,5
per i rispettivi attributi. Quello che non capisco è il metodo di ricerca.
Quando una mountain bike viene istanziata, poiché non ha il suo metodo initialize
, percorrerà la catena di ricerca del metodo sulla sua super classe (Bicycle
). Ma ora da lì sembra che la bicicletta ritorni al metodo post_initialize di MountainBike. Invece di continuare la catena del metodo, come può tornare indietro? post_initialize
è una parola chiave ruby come initialize
in quanto serve qualche tipo di funzione speciale? C'è qualche altro metodo di introspezione rubino che posso usare per vedere cosa sta succedendo?
Grazie Mr Keith. Vorrei solo aggiungere per rendere esplicitamente chiaro - "self" è il ricevitore implicito, e dato che l'istanza era una classe derivata, che self sarebbe l'istanza della classe derivata, che potrebbe quindi accedere al metodo pertinente che esisterebbe in quella particolare classe derivata (come da risposta di Jordan). – BKSpurgeon