Ruby Private & Protected Methods: porozumění metodám viditelnost

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.



+