mi a privát módszer a Ruby-ban?
ez egy olyan típusú módszer, amelyet csak az osztály belsejéből hívhat meg, ahol meg van határozva.
ez lehetővé teszi a módszerekhez való hozzáférés ellenőrzését.
a Rubin módszer lehet:
- privát
- nyilvános (alapértelmezett)
- védett
alapértelmezés szerint az összes módszer public
.
bárki használhatja őket!
de ezt megváltoztathatja egy private
vagy protected
módszerrel.
miért hasznos ez?
mert megkönnyítheti ezeket a módszereket.
képzelje el, hogy egy kódkönyvtárat ír, amelyet néhány különböző projektben használnak a munkahelyen.
amikor ezek a projektek végrehajtják a könyvtárat, metódusokat fognak hívni az Ön által létrehozott osztályokon.
most:
kiad egy új verziót…
de úgy döntött, hogy megváltoztatja a nevet egy public
módszerrel.
ez minden olyan projektnél hibát fog okozni, amely ezt a módszert használja!
emlékezz erre:
azáltal, hogy kevesebb nyilvános módszer van, növeli a változás szabadságát az osztályán belül.
nézzünk meg néhány kódot!
a privát módszerek megértése Ruby-ban
láttad már valaha a “privát módszer neve” hibaüzenetet?
ez egy:
self.puts 123# NoMethodError: private method `puts' called
ezután hibásan próbálta használni a private
módszert.
csak privát módszert használhat önmagában.
példa:
puts 123
ugyanaz a módszer, de így kell hívni.
a privát metódusokat mindig a self
kontextusában hívják meg.
más szavakkal…
csak privát módszereket használhat:
- más módszerek ugyanabból az osztályból
- a szülő osztálytól örökölt módszerek
- modulból vett módszerek
ez azt jelenti, hogy nem hívhat meg privát módszereket az őket definiáló osztályon kívülről.
mert ehhez “explicit vevőre”lenne szükség.
hacsak…
a send
– hez hasonló módszert nem használ a szabály megkerülésére.
send(:puts, "apple")
hogyan definiál egy private
módszert?
def bacon "private bacon"endprivate :bacon
a private
szó önmagában nem kulcsszó, hanem a Kernel
modulban meghatározott módszer.
hová tegye a privát metódusokat
normális, ha egy osztálynak egynél több privát metódusa van.
hol helyezi el ezeket a módszereket?
tegye ezt:
class Food def public_method end private def bacon end def orange end def coconut endend
a private
után minden példány metódus privát metódussá válik.
használhatja az
private_class_method :method_name
– et, ha egy osztály metódust privátként szeretne definiálni
ez egy általános minta, hogy először az összes nyilvános metódust definiálja, majd az osztály végén együtt definiálja a private
metódusokat.
nyilvános módszerek
Nyilvános az alapértelmezett módszer láthatósága a Ruby-ban.
Íme egy példa:
def orange "Vitamin C"end
ha van egy food
objektum, amely meghatározza a orange
értéket, akkor ezt így hívhatja:
food.orange
ha egy módszert priváttá vagy védetté tettek, újra nyilvánosságra hozhatja.
public :orange
mi a Védett módszer?
a Védett módszerek kevésbé gyakoriak.
olyanok, mint a private
módszerek, de meghívhatja őket egy objektumon & nem csak közvetlenül.
ha ezt a példát a private programmal próbálja meg, hibaüzenet jelenik meg:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
akkor kap a hiba, mert name
lenne privát, így nem lehet csinálni other.name
.
de protected
ez a kód működik!
privát vs védett módszerek
ez a különbség, az a tény, hogy protected
megtartja a módszert private
, de lehetővé teszi, hogy ezt a módszert egy objektumra hívja.
a privát csak akkor lehet csinálni name
, a védett meg tudod csinálni object.name
.
mikor kell használni a védett?
csak akkor, ha van egy nagyon konkrét eset, például az equals (==
) módszer.
a Ruby dokumentáció javasolja a private
használatát a protected
helyett, amikor csak lehetséges.
és itt van ez a jegyzet:
“a védett módszer lassú, mert nem tudja használni a belső gyorsítótárat.”
kíváncsi voltam erre, ezért futottam néhány referenciaértéket:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
ez 8,5% – os különbség a teljesítményben.
Video Tutorial
összefoglaló
megtanultad a Ruby módszer láthatóságát, nyilvános, privát & védett módszerek. Ezek nem Ruby kulcsszavak, hanem a Module
osztályban definiált módszerek.