Oto kod:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
Co chcę wiedzieć, jest różnica między używaniem @age
i self.age
w age_difference_with
metodzie.
ruby
self
instance-variables
Sarunw
źródło
źródło
Różnica polega na tym, że izoluje użycie metody od jej wdrożenia. Jeśli implementacja właściwości miałaby ulec zmianie - powiedzmy, aby zachować datę urodzenia, a następnie obliczyć wiek na podstawie różnicy czasu między teraz a datą urodzenia - kod w zależności od metody nie musi się zmieniać. Jeśli użyłby tej właściwości bezpośrednio, zmiana musiałaby się rozprzestrzenić na inne obszary kodu. W tym sensie bezpośrednie użycie właściwości jest bardziej kruche niż użycie interfejsu zapewnianego przez klasę.
źródło
Ostrzegaj, gdy odziedziczysz klasę, z
Struct.new
której jest dobry sposób na wygenerowanie intializatora ( Jak wygenerować inicjalizator w Ruby? )wróci
Jednak po usunięciu inicjalizatora zostanie on zwrócony
Z definicją klasy
Powinieneś podać konstruktor.
wróci
źródło
Pierwsza odpowiedź jest całkowicie poprawna, ale jako względny początkujący nie od razu zrozumiałem, co to sugeruje (wysyłanie wiadomości do siebie? Huh ...). Myślę, że krótki przykład pomoże:
źródło
Nie ma żadnej różnicy. Podejrzewam, że zrobiono to tylko dla dokumentalnej wartości widzenia
self.age
iother_person.age
zbliżania się do siebie.Podejrzewam, że użycie pozwala na napisanie w przyszłości faktycznego gettera, co może zrobić coś bardziej złożonego niż tylko zwrócenie zmiennej instancji, a w takim przypadku metoda nie musiałaby się zmieniać.
Jest to jednak mało prawdopodobna abstrakcja, o którą należy się martwić, jeśli zmiana implementacji obiektu jest uzasadniona, należy zmienić inne metody, w pewnym momencie proste odniesienie do samego obiektu jest całkowicie uzasadnione.
W każdym razie abstrakcja
age
własności wciąż nie wyjaśnia jednoznacznego użyciaself
, ponieważ zwykłyage
przywołałby również akcesora.źródło
@ wiek - to zdecydowanie wiek zmiennej instancji
self.age - odnosi się do wieku własności instancji.
źródło