co to jest prywatna metoda w Ruby?
jest to rodzaj metody, którą można wywołać tylko z poziomu klasy, w której jest zdefiniowana.
pozwala to kontrolować dostęp do metod.
metoda Ruby może być:
- prywatne
- publiczne (domyślnie)
- chronione
domyślnie wszystkie Twoje metody są public
.
każdy może z nich skorzystać!
ale możesz to zmienić, wykonując metodę private
lub protected
.
dlaczego jest to przydatne?
ponieważ możesz ułatwić zmianę tych metod.
wyobraź sobie, że piszesz bibliotekę kodu, która będzie używana w kilku różnych projektach w pracy.
kiedy te projekty implementują Twoją bibliotekę, będą wywoływać metody w klasach, które utworzyłeś.
teraz:
wydajesz nową wersję…
ale zdecydowałeś się zmienić nazwę na public
metodzie.
to spowoduje błędy w każdym projekcie, który używa tej metody!
Zapamiętaj to:
posiadając mniej publicznych metod zwiększasz swobodę zmian wewnątrz klasy.
zobaczmy kilka przykładów kodu!
zrozumienie prywatnych metod w Ruby
czy kiedykolwiek widziałeś komunikat o błędzie „private method called”?
ten:
self.puts 123# NoMethodError: private method `puts' called
następnie próbowano użyć metody private
nieprawidłowo.
możesz używać tylko prywatnej metody.
przykład:
puts 123
to ta sama metoda, ale musisz to tak nazwać.
prywatne metody są zawsze wywoływane w kontekście self
.
innymi słowy …
możesz używać tylko prywatnych metod z:
- Inne metody z tej samej klasy
- metody odziedziczone z klasy nadrzędnej
- metody zawarte w module
oznacza to, że nie można wywoływać prywatnych metod spoza klasy, która je definiuje.
bo to wymagałoby „jawnego odbiornika”.
chyba że…
używasz metody takiej jak send
, aby ominąć tę regułę.
send(:puts, "apple")
jak zdefiniować metodę private
?
def bacon "private bacon"endprivate :bacon
samo słowo private
nie jest słowem kluczowym, jest to metoda zdefiniowana w module Kernel
.
gdzie umieścić swoje prywatne metody
to normalne, że klasa ma więcej niż jedną prywatną metodę.
gdzie umieszczacie te metody?
zrób to:
class Food def public_method end private def bacon end def orange end def coconut endend
każda metoda instancji po private
staje się metodą prywatną.
możesz użyć
private_class_method :method_name
jeśli chcesz zdefiniować metodę klasy jako prywatną
jest to wspólny wzorzec, aby najpierw zdefiniować wszystkie Twoje publiczne metody, a następnie zdefiniować swoje private
metody razem na końcu klasy.
publiczne metody
Public jest domyślną widocznością metody w Rubim.
oto przykład:
def orange "Vitamin C"end
jeśli masz obiekt food
, który definiuje orange
, możesz go tak nazwać:
food.orange
jeśli metoda została upubliczniona lub zabezpieczona, można ją ponownie upublicznić.
public :orange
co to jest metoda chroniona?
metody chronione są mniej powszechne.
są one jak metody private
, ale można je wywołać na obiekcie & nie tylko bezpośrednio.
jeśli wypróbujesz ten przykład z prywatnym, otrzymasz błąd:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
dostajesz błąd, ponieważ name
byłby prywatny, więc nie możesz zrobić other.name
.
ale z protected
ten kod działa!
prywatne Vs chronione metody
to jest różnica, fakt, że protected
zachowuje metodę private
, ale pozwala również na wywołanie tej metody na obiekcie.
z prywatnym możesz zrobić tylko name
, z chronionym możesz zrobić object.name
.
kiedy należy używać protected?
tylko jeśli masz bardzo konkretny przypadek, jak metoda equals (==
).
dokumentacja Rubiego zaleca użycie private
zamiast protected
, gdy tylko jest to możliwe.
i jest taka notka:
„chroniona metoda jest powolna, ponieważ nie może używać wbudowanej pamięci podręcznej.”
byłem ciekawy tego, więc sprawdziłem kilka benchmarków:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
to różnica 8,5% w wydajności.
Video Tutorial
podsumowanie
nauczyłeś się o metodach Ruby visibility, public, private & chronionych. Nie są to słowa kluczowe Ruby, są to same metody zdefiniowane w klasie Module
.