W Rubim rozumiem podstawową ideę extend
. Jednak co się dzieje w tym segmencie kodu? A konkretnie, co robi extend
? Czy jest to tylko wygodny sposób przekształcenia metod instancji w metody klasowe? Dlaczego miałbyś to robić w ten sposób, zamiast określać metody klas od początku?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
ma z tym wspólnego.W module self jest samą klasą modułu. Na przykład
zwróci Rake, więc
zasadniczo udostępnia metody instancji zdefiniowane w Rake, więc możesz to zrobić
źródło
Dla mnie to zawsze pomaga myśleć
extend
jakinclude
wewnątrz klasy singleton (znany również jako meta lub EIGEN klasie).Zapewne wiesz, że metody zdefiniowane w klasie singleton są w zasadzie metodami klasowymi:
Teraz, gdy wiemy, że
extend
będąinclude
metody w module wewnątrz klasy singleton, a tym samym narazić je jako metody klasy:źródło
Aby uniknąć gnicia linków, poniżej opublikowano ponownie post Chrisa Wanstratha, do którego prowadzi user83510 (za jego zgodą). Jednak nic nie przebije oryginału, więc używaj jego linku tak długo, jak będzie działać.
→ singin 'singletons 18 listopada 2008 Są rzeczy, których po prostu nie rozumiem. Na przykład David Bowie. Albo na półkuli południowej. Ale nic tak nie zadziwia mnie jak Singleton Ruby. Bo naprawdę, to zupełnie niepotrzebne.
Oto, co chcą, abyś zrobił ze swoim kodem:
Ale to jest szalone. Walcz z mocą.
Każdy, dlaczego nie? Interfejs API jest bardziej zwięzły, kod jest łatwiejszy do testowania, makiety i odgałęzienia, a konwersja na odpowiednią klasę w razie potrzeby jest nadal bardzo prosta.
((prawa autorskie powinny mieć ten Chris Wanstrath))
źródło
extend self
obejmuje wszystkie istniejące metody instancji jako metody modułu. To jest równoznaczne z powiedzeniemextend Rake
. RównieżRake
jest obiektem klasyModule
.Innym sposobem uzyskania równoważnego zachowania będzie:
Może to służyć do definiowania samodzielnych modułów z prywatnymi metodami.
źródło