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 private
eller 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_name
hvis 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.