Ruby Private & Protected Methods: Understanding Method Visibility

mikä on yksityinen menetelmä Rubyssa?

se on eräänlainen metodi, johon voi soittaa vain sen luokan sisältä, jossa se on määritelty.

Näin voit kontrolloida pääsyä omiin menetelmiisi.

Rubiinimenetelmä voi olla:

  • yksityinen
  • Julkinen (oletusarvo)
  • suojattu

oletuksena kaikki metodit ovat public.

kuka tahansa voi käyttää niitä!

mutta tätä voi muuttaa tekemällä menetelmällä private tai protected.

miksi tämä on hyödyllistä?

koska voit tehdä näiden menetelmien muuttamisen helpommaksi.

Kuvittele kirjoittavasi koodikirjastoa, jota tullaan käyttämään muutamissa eri projekteissa töissä.

kun nämä projektit toteuttavat kirjastosi, ne tulevat kutsumaan metodeja luomillesi luokille.

nyt:

julkaisette uuden version …

, mutta päätitte vaihtaa nimen public – menetelmällä.

That ’ s going to product errors on every project that is using this method!

muista tämä:

vähemmillä julkisilla menetelmillä lisätään muutoksen vapautta oman luokan sisällä.

katsotaanpa muutama koodiesimerkki!

yksityisten menetelmien ymmärtäminen Rubyssa

Oletko koskaan nähnyt” private method called ” – virheviestiä?

tämä:

self.puts 123# NoMethodError: private method `puts' called

silloin on yritetty käyttää private – menetelmää väärin.

yksityistä menetelmää voi käyttää vain itse.

esimerkki:

puts 123

sama metodi, mutta sitä pitää kutsua näin.

yksityisiä menetelmiä kutsutaan aina selfyhteydessä.

toisin sanoen …

voit käyttää vain yksityisiä menetelmiä:

  • muita saman luokan menetelmiä
  • vanhemman luokasta
  • moduulista

periytyviä menetelmiä ei voi kutsua yksityisiksi menetelmiksi niitä määrittelevän luokan ulkopuolelta.

, koska se vaatisi ”eksplisiittistä vastaanottajaa”.

ellei …

käytä send kaltaista menetelmää tämän säännön ohittamiseen.

send(:puts, "apple")

miten private – menetelmä määritellään?

def bacon "private bacon"endprivate :bacon

itse sana private ei ole avainsana, vaan Kernel – moduulissa määritelty menetelmä.

mihin laittaa Yksityiset metodit

on normaalia, että luokalla on useampi kuin yksi yksityinen menetelmä.

mihin nämä menetelmät sijoitetaan?

tee näin:

class Food def public_method end private def bacon end def orange end def coconut endend

jokainen instanssimenetelmä private jälkeen muuttuu yksityiseksi menetelmäksi.

voit käyttää private_class_method :method_name jos haluat määritellä luokkamenetelmän yksityisenä

on yleinen kuvio määritellä ensin kaikki julkiset metodit, sitten määritellä private metodit yhdessä luokan lopussa.

Public Methods

Public on Rubyssa menetelmän oletusnäkyvyys.

tässä esimerkki:

def orange "Vitamin C"end

jos sinulla on objekti food, joka määrittelee orange, voit kutsua sitä näin:

food.orange

jos menetelmästä on tehty yksityinen tai suojattu, sen voi julkistaa uudelleen.

public :orange

mikä on suojattu menetelmä?

suojatut menetelmät ovat harvinaisempia.

ne ovat kuin private menetelmiä, mutta niitä voi kutsua kohteesta & ei vain suoraan.

jos kokeilet tätä esimerkkiä private-ohjelmalla, saat virheen:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

saat virheen, koska name olisi yksityinen, joten et voi tehdä other.name.

mutta protected tämä koodi toimii!

Yksityiset vs suojatut menetelmät

siinä ero, että protected pitää menetelmän private, mutta se mahdollistaa myös sen, että menetelmää voi kutsua esineeseen.

yksityisellä voi tehdä vain name, suojatulla voi tehdä object.name.

milloin sinun tulee käyttää suojattua valmistetta?

vain, jos sinulla on hyvin erityistapaus, kuten equals (==) – menetelmä.

Ruby-dokumentaatio suosittelee käyttämään private: ää protected: n sijasta aina kun se on mahdollista.

ja on tämä nuotti:

”suojattu menetelmä on hidas, koska se ei voi käyttää inline välimuisti.”

olin utelias tästä, joten tein vertailukohtia.:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

ero suorituksissa on 8,5 prosenttia.

opetusvideo

Yhteenveto

olet oppinut Ruby-menetelmän näkyvyydestä, julkisista, yksityisistä & suojatuista menetelmistä. Nämä eivät ole Rubiinisia avainsanoja, vaan ne ovat itse Module – luokalle määriteltyjä menetelmiä.



+