ce este o metodă privată în Ruby?
este un tip de metodă pe care o puteți apela numai din interiorul clasei unde este definită.
aceasta vă permite să controlați accesul la metodele dvs.
o metodă rubin poate fi:
- privat
- public (implicit)
- protejat
implicit toate metodele dvs. sunt public
.
oricine le poate folosi!
dar puteți schimba acest lucru, făcând o metodă private
sau protected
.
de ce este util acest lucru?
pentru că puteți face aceste metode mai ușor de schimbat.
Imaginați-vă că scrieți o bibliotecă de coduri care va fi utilizată în câteva proiecte diferite la locul de muncă.
când aceste proiecte implementează biblioteca dvs., vor apela metode pe clasele pe care le-ați creat.
acum:
lansați o nouă versiune…
dar ați decis să schimbați numele pe o metodă public
.
asta va produce erori la fiecare proiect care folosește această metodă!
amintiți-vă acest lucru:
având mai puține metode publice, creșteți libertatea schimbării în clasa voastră.
să vedem câteva exemple de cod!
înțelegerea metodelor Private în Ruby
ați văzut vreodată mesajul de eroare” metoda privată numită”?
acesta:
self.puts 123# NoMethodError: private method `puts' called
apoi ați încercat să utilizați incorect o metodă private
.
puteți utiliza numai o metodă privată de la sine.
exemplu:
puts 123
este aceeași metodă, dar trebuie să o numiți așa.
metodele Private sunt întotdeauna numite în contextul self
.
cu alte cuvinte…
puteți utiliza numai metode private cu:
- alte metode din aceeași clasă
- metode moștenite din clasa părinte
- metode incluse dintr-un modul
aceasta înseamnă că nu puteți apela metode private din afara clasei care le definește.
pentru că asta ar necesita un „receptor explicit”.
cu excepția cazului în care…
utilizați o metodă ca send
pentru a ocoli această regulă.
send(:puts, "apple")
cum definiți o metodă private
?
def bacon "private bacon"endprivate :bacon
cuvântul private
în sine nu este un cuvânt cheie, este o metodă definită pe modulul Kernel
.
unde să puneți metodele Private
este normal ca o clasă să aibă mai multe metode private.
unde plasați aceste metode?
fă asta:
class Food def public_method end private def bacon end def orange end def coconut endend
fiecare metodă de instanță după private
devine o metodă privată.
puteți utiliza
private_class_method :method_name
dacă doriți să definiți o metodă de clasă ca privată
este un model comun să definiți mai întâi toate metodele publice, apoi să definiți metodele private
împreună la sfârșitul clasei.
metode publice
Public este vizibilitatea metodei implicite în Ruby.
Iată un exemplu:
def orange "Vitamin C"end
dacă aveți un obiect food
care definește orange
, îl puteți numi astfel:
food.orange
dacă o metodă a fost făcută privată sau protejată, o puteți face din nou publică.
public :orange
ce este o metodă protejată?
metodele protejate sunt mai puțin frecvente.
sunt ca private
metode, dar le puteți apela pe un obiect & nu doar direct.
dacă încercați acest exemplu cu privat, veți primi o eroare:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
primiți eroarea deoarece name
ar fi privat, deci nu puteți face other.name
.
dar cu protected
acest cod funcționează!
privat Vs metode protejate
asta e diferența, faptul că protected
păstrează metoda private
, dar, de asemenea, vă permite să apelați această metodă pe un obiect.
cu privat puteți face doar name
, cu protejat puteți face object.name
.
când trebuie să utilizați protejat?
numai dacă aveți un caz foarte specific, cum ar fi metoda equals (==
).
documentația Ruby recomandă utilizarea private
în loc de protected
ori de câte ori este posibil.
și există această notă:
„o metodă protejată este lentă, deoarece nu poate utiliza memoria cache inline.”
am fost curios despre asta, așa că am rulat câteva repere:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
aceasta este o diferență de 8,5% în performanță.
tutorial Video
rezumat
ai învățat despre vizibilitate metoda Ruby, publice, private & metode protejate. Acestea nu sunt cuvinte cheie Ruby, ele sunt metode ele însele definite pe Module
clasă.