Ruby Private & beskyttede metoder: forståelse metode synlighed

Hvad er en privat metode i Ruby?

det er en type metode, som du kun kan ringe fra inde i klassen, hvor den er defineret.

dette giver dig mulighed for at kontrollere adgangen til dine metoder.

en rubin metode kan være:

  • privat
  • offentlig (standard)
  • beskyttet

som standard er alle dine metoder public.

alle kan bruge dem!

men du kan ændre dette ved at lave en metode privateeller protected.

Hvorfor er dette nyttigt?

fordi du kan gøre disse metoder lettere at ændre.

Forestil dig, at du skriver et kodebibliotek, der skal bruges i et par forskellige projekter på arbejdspladsen.

når disse projekter implementerer dit bibliotek, vil de kalde metoder på de klasser, du har oprettet.

nu:

du frigiver en ny version…

men du besluttede at ændre navnet på en public metode.

det kommer til at producere fejl på hvert projekt, der bruger denne metode!

husk dette:

ved at have mindre offentlige metoder øger du forandringsfriheden i din klasse.

lad os se et par kodeeksempler!

forståelse af Private metoder i Ruby

har du nogensinde set fejlmeddelelsen “privat metode kaldet”?

denne ene:

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

så har du forsøgt at bruge en private metode forkert.

du kan kun bruge en privat metode alene.

eksempel:

puts 123

det er den samme metode, men du skal kalde det sådan.

Private metoder kaldes altid inden for rammerne af self.

med andre ord …

du kan kun bruge private metoder med:

  • andre metoder fra samme klasse
  • metoder arvet fra forældreklassen
  • metoder inkluderet fra et modul

dette betyder, at du ikke kan ringe til private metoder uden for den klasse, der definerer dem.

fordi det ville kræve en “eksplicit modtager”.

medmindre…

du bruger en metode som send for at omgå denne regel.

send(:puts, "apple")

Hvordan definerer du en private metode?

def bacon "private bacon"endprivate :bacon

ordet private i sig selv er ikke et nøgleord, det er en metode defineret på modulet Kernel.

hvor skal du placere dine Private metoder

det er normalt, at en klasse har mere end en privat metode.

hvor placerer du disse metoder?

gør dette:

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

hver instansmetode efter private bliver en privat metode.

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

det er et almindeligt mønster at definere alle dine offentlige metoder først og derefter definere dine private metoder sammen i slutningen af klassen.

offentlige metoder

Offentlig er standardmetoden synlighed i Ruby.

her er et eksempel:

def orange "Vitamin C"end

hvis du har et objekt food, der definerer orange, kan du kalde det sådan:

food.orange

hvis en metode er blevet gjort privat eller beskyttet, kan du gøre den offentlig igen.

public :orange

Hvad er en beskyttet metode?

beskyttede metoder er mindre almindelige.

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

hvis du prøver dette eksempel med private, får du en fejl:

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 fejlen, fordi name ville være privat, så du ikke kan gøre other.name.

men med protected denne kode virker!

Private vs beskyttede metoder

det er forskellen, det faktum, at protected holder metoden private, men det giver dig også mulighed for at kalde denne metode på et objekt.

med privat kan du kun gøre name, med Beskyttet kan du gøre object.name.

Hvornår skal du bruge beskyttet?

kun hvis du har en meget specifik sag, som lig med (==) metode.

Ruby-dokumentationen anbefaler at bruge private i stedet for protected når det er muligt.

og der er denne note:

“en beskyttet metode er langsom, fordi den ikke kan bruge inline cache.”

jeg var nysgerrig efter dette, så jeg kørte nogle benchmarks:

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

det er en forskel på 8,5% i ydeevne.

Video Tutorial

oversigt

du har lært om Ruby metode synlighed, offentlig, privat & beskyttede metoder. Disse er ikke Ruby søgeord, de er metoder selv defineret på Module klassen.



+