Czytam POODR Sandi Metz i natknąłem się na zasadę kodowania, której nie rozumiem. Oto kod:Czy ktoś może pomóc w wyjaśnieniu wywołania zwrotnego post_initialize w celu utworzenia klasy (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
Ten kod wyświetli 1,2,3,4,5
dla swoich odpowiednich atrybutów. Czego nie rozumiem, to metoda wyszukiwania.
Gdy tworzony jest rower górski, ponieważ nie ma on własnej metody initialize
, przejdzie on w górę łańcucha wyszukiwania metod na swoją super klasę (Bicycle
). Ale teraz wydaje się, że rower cofa się w dół do metody post_initialize MountainBike. Zamiast kontynuować łańcuch metod, jak można go wycofać? Czy post_initialize
słowo kluczowe ruby, takie jak initialize
, służy do jakiejś specjalnej funkcji? Czy istnieją inne metody introspekcji ruby, które mogę wykorzystać, aby zobaczyć, co się dzieje?
Dziękuję Keith. Chciałbym tylko dodać, aby było to wyraźnie jasne - "self" jest niejawnym odbiorcą, a biorąc pod uwagę, że instancja była klasą pochodną, to self byłoby instancją klasy pochodnej, która mogłaby wtedy uzyskać dostęp do odpowiedniej metody, która ta konkretna klasa pochodna (jak na odpowiedź Jordana). – BKSpurgeon