Ruby Private & Protected Methods: Method Visibility

Wat is een private methode in Ruby?

het is een type methode dat je alleen kunt aanroepen vanuit de klasse waar het is gedefinieerd.

Hiermee kunt u de toegang tot uw methoden beheren.

een Ruby-methode kan:

  • privé
  • openbaar (standaard)
  • beschermd

standaard zijn al uw methoden public.

iedereen kan ze gebruiken!

maar u kunt dit wijzigen door een methode private of protectedte maken.

Waarom is dit nuttig?

omdat u deze methoden gemakkelijker kunt wijzigen.

stel je voor dat je een codebibliotheek aan het schrijven bent die gebruikt zal worden in een paar verschillende projecten op het werk.

wanneer deze projecten uw bibliotheek implementeren, zullen ze methoden aanroepen op de klassen die u hebt gemaakt.

nu:

u geeft een nieuwe versie uit …

maar u besloot de naam van een public methode te wijzigen.

dat zal fouten produceren op elk project dat deze methode gebruikt!

onthoud dit:

door minder openbare methoden te gebruiken vergroot u de Vrijheid van verandering binnen uw klasse.

laten we een paar code voorbeelden bekijken!

Privémethoden in Ruby

hebt u ooit de foutmelding “privémethode genaamd” gezien?

deze:

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

dan hebt u geprobeerd een private methode onjuist te gebruiken.

u kunt alleen een privémethode op zichzelf gebruiken.

voorbeeld:

puts 123

het is dezelfde methode, maar je moet het zo noemen.

Private methoden worden altijd aangeroepen binnen de context van self.

met andere woorden …

u kunt alleen privé-methoden gebruiken met:

  • andere methoden uit dezelfde klasse
  • methoden overgenomen van de bovenliggende klasse
  • methoden opgenomen van een module

dit betekent dat u geen privé methoden kunt aanroepen van buiten de klasse die ze definieert.

omdat daarvoor een “expliciete ontvanger”nodig is.

tenzij …

u gebruikt een methode als send om deze regel te omzeilen.

send(:puts, "apple")

hoe definieert u een private methode?

def bacon "private bacon"endprivate :bacon

het woord private zelf is geen trefwoord, het is een methode gedefinieerd in de Kernel module.

waar u uw Privémethoden moet plaatsen

het is normaal dat een klasse meer dan één privémethode heeft.

waar plaatst u deze methoden?

doe dit:

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

elke instantie methode na private wordt een private methode.

u kunt private_class_method :method_name gebruiken als u een class-methode wilt definiëren als privé

het is een gebruikelijk patroon om eerst al uw openbare methoden te definiëren en vervolgens uw private – methoden samen aan het einde van de klasse te definiëren.

Public Methods

Public is de standaard method visibility in Ruby.

hier is een voorbeeld:

def orange "Vitamin C"end

als u een object food hebt dat orange definieert, kunt u het zo noemen:

food.orange

als een methode privé of beschermd is gemaakt, kunt u deze opnieuw openbaar maken.

public :orange

Wat is een beschermde methode?

beschermde methoden komen minder vaak voor.

ze zijn als private methoden, maar je kunt ze aanroepen op een object & niet alleen direct.

als je dit voorbeeld met privé probeert krijg je een fout:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

u krijgt de fout omdat name privé zou zijn, dus u kunt other.nameniet doen.

maar met protected werkt deze code!

private vs Protected Methods

dat is het verschil, het feit dat protected de methode private behoudt, maar het staat je ook toe om die methode op een object aan te roepen.

met privé kunt u alleen name doen, met protected kunt u object.namedoen.

Wanneer moet u protected gebruiken?

alleen als u een zeer specifiek geval hebt, zoals de methode is gelijk aan (==).

in de Ruby-documentatie wordt aanbevolen om indien mogelijk private te gebruiken in plaats van protected.

en er is deze noot:

“een beschermde methode is traag omdat het geen inline cache kan gebruiken.”

ik was nieuwsgierig naar dit dus ik liep een aantal benchmarks:

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

dat is een verschil van 8,5% in prestaties.

videotutorial

samenvatting

u hebt geleerd over zichtbaarheid van Ruby-methode, publieke, private & beschermde methoden. Dit zijn geen Ruby trefwoorden, het zijn methoden zelf gedefinieerd op de Module klasse.



+