Ruby Private & Protected Methods: Forstå Metode Synlighet

Hva er en privat metode I Ruby?

Det er en type metode som DU bare kan ringe fra innsiden av klassen der den er definert.

dette lar deg kontrollere tilgangen til metodene dine.

En Rubinmetode kan være:

  • privat
  • offentlig (standard)
  • beskyttet

SOM standard er alle metodene public.

Alle kan bruke dem!

men du kan endre dette ved å lage en metode private eller protected.

Hvorfor er dette nyttig?

fordi du kan gjøre disse metodene enklere å endre.

Tenk deg at du skriver et kodebibliotek som skal brukes i noen forskjellige prosjekter på jobben.

når disse prosjektene implementerer biblioteket ditt, kommer de til å ringe metoder på klassene du har opprettet.

Nå:

du slipper en ny versjon…

Men du bestemte deg for å endre navnet på en public – metode.

Det kommer til å produsere feil på hvert prosjekt som bruker denne metoden!

Husk dette:

VED Å ha MINDRE offentlige metoder ØKER du endringsfriheten i klassen din.

La oss se noen kodeeksempler!

Forstå Private Metoder I Ruby

har du noen gang sett feilmeldingen «privat metode kalt»?

Denne:

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

Da har du forsøkt å bruke en private – metode feil.

du kan bare bruke en privat metode av seg selv.

Eksempel:

puts 123

det er den samme metoden, men du må kalle det slik.

Private metoder kalles alltid innenfor konteksten self.

Med andre ord…

du kan bare bruke private metoder med:

  • Andre metoder fra samme klasse
  • Metoder arvet fra den overordnede klassen
  • Metoder inkludert fra en modul

dette betyr at du ikke kan kalle private metoder fra utenfor klassen som definerer dem.

Fordi det ville kreve en «eksplisitt mottaker».

Med Mindre…

du bruker en metode som send for å omgå denne regelen.

send(:puts, "apple")

hvordan definerer du en private metode?

def bacon "private bacon"endprivate :bacon

ordet private i seg selv er ikke et søkeord, det er en metode definert på modulen Kernel.

Hvor Du Skal Plassere Dine Private Metoder

det er normalt at en klasse har mer enn en privat metode.

Hvor plasserer du disse metodene?

Gjør dette:

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

Hver instansmetode etter private blir en privat metode.

du kan bruke private_class_method :method_namehvis du vil definere en klassemetode som privat

det er et vanlig mønster å definere alle dine offentlige metoder først, og deretter definere dine private metoder sammen på slutten av klassen.

Offentlige Metoder

Offentlig Er standard metodesynlighet I Ruby.

her er et eksempel:

def orange "Vitamin C"end

hvis du har et objekt food som definerer orange, kan du ringe det slik:

food.orange

hvis en metode er gjort privat eller beskyttet, kan du gjøre den offentlig igjen.

public :orange

Hva Er En Beskyttet Metode?

Beskyttede metoder er mindre vanlige.

de er som private metoder, men du kan ringe dem på et objekt & ikke bare direkte.

hvis du prøver dette eksemplet med privat, får du en feil:

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

du får feilen fordi name ville være privat, så du kan ikke gjøre other.name.

Men med protected fungerer denne koden!

Private vs Beskyttede Metoder

det er forskjellen, det faktum at protected holder metoden private , men det lar deg også ringe den metoden på et objekt.

med privat kan du bare gjøre name, med beskyttet kan du gjøre object.name.

når bør du bruke beskyttet?

Bare hvis du har et veldig spesifikt tilfelle, som equals (==) – metoden.

Ruby-dokumentasjonen anbefaler at du bruker private i stedet for protected når det er mulig.

Og det er dette notatet:

«en beskyttet metode er treg fordi den ikke kan bruke innebygd hurtigbuffer.»

jeg var nysgjerrig på dette, så jeg kjørte noen referanser:

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

det er en forskjell på 8,5% i ytelse.

Video Tutorial

Sammendrag

Du har lært Om Ruby metode synlighet, offentlig, privat & beskyttede metoder. Dette er Ikke Ruby søkeord, de er metoder selv definert på klassen Module.



+