Bezpośredni dostęp do zmiennej wystąpienia a użycie metody akcesora

80

Czy ktoś może wyjaśnić różnicę między dostępem do atrybutu instancji za pośrednictwem self.attributei przez @attribute?

pistacchio
źródło

Odpowiedzi:

100

self.attributewywołuje metodę attribute.
self.attribute = valuewywołuje metodę attribute=z argumentem value.
@attributei @attribute = valuepobierz / ustaw wartość zmiennej instancji @attribute.

Zasadniczo są to dwie zupełnie różne rzeczy.

Jednak jeśli wywołasz attr_accessor :attributeto, definiuje metodę attributedo zwrócenia @attributei metodę attribute=(value)do ustawienia @attribute = value. Więc w tym przypadku nie ma różnicy.

sepp2k
źródło
14
Zauważ, że generalnie zaleca się użycie self.(chyba że piszesz metodę pobierającą / ustawiającą), nawet jeśli obecnie masz attr_accessor. Chroni to Cię przed dodatkową pracą nad refaktoryzacją i błędami, jeśli później zmienisz metody dostępu, aby zrobić coś więcej niż tylko pobranie / ustawienie zmiennej instancji. (Lub jeśli ktoś inny łata lub podklasa twoją pracę.)
Phrogz
6
Jednym z błędów, o którym mówi Phrogz, jest to, że jeśli po prostu wywołasz atrybut = _____ zamiast self.attribute = ______, ustawiasz zmienną lokalną zamiast zmiennej instancji.
Jason Noble