co je soukromá metoda v Ruby?
je to typ metody, kterou můžete volat pouze zevnitř třídy, kde je definována.
to vám umožní řídit přístup k vašim metodám.
Ruby metoda může být:
- soukromé
- public (výchozí)
- protected
ve výchozím nastavení VŠECHNY vaše metody jsou public
.
kdokoli je může použít!
ale můžete to změnit metodou private
nebo protected
.
proč je to užitečné?
protože můžete tyto metody snadněji změnit.
Představte si, že píšete knihovnu kódů, která bude použita v několika různých projektech v práci.
když tyto projekty implementují vaši knihovnu, budou volat metody na třídách, které jste vytvořili.
nyní:
vydáte novou verzi …
ale rozhodli jste se změnit název metodou public
.
to bude produkovat chyby na každém projektu, který používá tuto metodu!
Zapamatujte si to:
tím, že máte méně veřejných metod, zvyšujete svobodu změny ve své třídě.
podívejme se na několik příkladů kódu!
porozumění soukromým metodám v Ruby
viděli jste někdy chybovou zprávu „soukromá metoda s názvem“?
tento:
self.puts 123# NoMethodError: private method `puts' called
pak jste se pokusili použít metodu private
nesprávně.
můžete použít pouze soukromou metodu samotnou.
příklad:
puts 123
je to stejná metoda, ale musíte to nazvat takto.
soukromé metody jsou vždy volány v kontextu self
.
jinými slovy,
můžete používat pouze soukromé metody s:
- Jiné metody ze stejné třídy
- Metody zděděné z nadřazené třídy
- Metody zahrnuty z modulu
To znamená, že nemůžete volání soukromé metody mimo třídu, která je definuje.
protože by to vyžadovalo „explicitní přijímač“.
Pokud…
použití metody, jako send
obejít toto pravidlo.
send(:puts, "apple")
jak definujete metodu private
?
def bacon "private bacon"endprivate :bacon
slovo private
samo o sobě není klíčovým slovem, je to metoda definovaná na modulu Kernel
.
kam umístit své soukromé metody
je normální, že třída má více než jednu soukromou metodu.
kam tyto metody umístíte?
Udělej to:
class Food def public_method end private def bacon end def orange end def coconut endend
každá metoda instance po private
se stává soukromou metodou.
můžete použít
private_class_method :method_name
pokud chcete definovat metodu třídy jako soukromé,
To je běžný model definovat všechny své veřejné metody první, pak definovat private
metody spolu na konci třídy.
veřejné metody
veřejnost je výchozí viditelností metody v Ruby.
Tady je příklad:
def orange "Vitamin C"end
Pokud budete mít objekt food
, který definuje orange
, můžete volat to takhle:
food.orange
Pokud metoda byla provedena soukromé nebo chráněné, můžete je zveřejnit znovu.
public :orange
co je chráněná metoda?
Chráněné metody jsou méně časté.
jsou jako private
metody, ale můžete je volat na objekt & nejen přímo.
pokud zkusíte tento příklad se soukromým, zobrazí se chyba:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
dostanete chybu, protože name
by bylo soukromé, takže nemůžete dělat other.name
.
ale s protected
tento kód funguje!
Soukromé vs Chráněné Metody
to je ten rozdíl, skutečnost, že protected
udržuje metoda private
, ale to také umožňuje volat tuto metodu na objekt.
se soukromým můžete dělat pouze name
, s chráněným můžete dělat object.name
.
kdy byste měli používat chráněné?
pouze pokud máte velmi specifický případ, jako je metoda equals (==
).
dokumentace Ruby doporučuje použít private
místo protected
, kdykoli je to možné.
a je tu tato poznámka:
„chráněná metoda je pomalá, protože nemůže používat vloženou mezipaměť.“
byl jsem na to zvědavý, tak jsem běžel několik měřítek:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
to je rozdíl ve výkonu 8,5%.
Video Tutorial
shrnutí
dozvěděli jste se o Ruby method visibility, public, private & protected methods. Nejedná se o Ruby klíčová slova, jsou to samotné metody definované ve třídě Module
.