Ruby 3.0. Ruby en minder bekende privacycontrolemethoden
Tomasz Szkaradek
Ontwikkelingsarchitect
Een van de meest geliefde eigenschappen van Ruby is de zeer flexibele syntax. Persoonlijk hou ik van Ruby vanwege de vele mogelijkheden die we hebben in het definiëren van classes en hun eigenschappen, en dit is wat ik in dit artikel zal bespreken.
Basisoplossingen
Laten we aannemen dat we de klasse Foo gebruiken die één openbare methode en één privémethode heeft:
klasse Foo
def bar
:geweldig
einde
privé
def baz
:iets_particulier
einde
einde
Alles is geweldig, we zien zo'n oplossing in vrijwel elke project. Hardlopen Foo.nieuw.baz veroorzaakt de fout NoMethodError (privémethode 'baz' aangeroepen voor # ) en dat is wat we wilden doen. Wat gebeurt er als we het opslagformaat proberen te wijzigen en private als voorvoegsel aan de klassedefinitie toevoegen?
klasse Foo
def bar
:geweldig
einde
privé def baz
:iets_particulier
einde
einde
Zoals je kunt zien na het uitvoeren van de codeHet werkt echt! Waarom kunnen we de zichtbaarheid van de methode invoeren voordat we het doen? Omdat bij het definiëren van een methode, def de naam van de methode als een symbool teruggeeft. Deze expressie is niet alleen een deel van de syntaxis, maar de facto een methode die is afgeleid van de klasse Module en die dit symbool als argument behandelt. Zie voor meer informatie de documentatie in deze link. Omdat het zo makkelijk begon met private, laten we proberen de zichtbaarheid van de private methode te veranderen.
klasse Foo
def bar
:geweldig
einde
privé def baz
:iets_particulier
einde
publiek :baz
einde
Wat gebeurt er na het uitvoeren van de code?
irb(main):012:0> Foo.new.baz
=> :iets_particulier
Succes! Onze basismethode is nu publiek omdat we hem twee keer zichtbaar hebben gemaakt. Natuurlijk geldt dezelfde operatie voor de modules. Geweldig, maar wat levert het ons op? Deze functionaliteit geeft ons veel omdat we vrijelijk de zichtbaarheid van een methode kunnen veranderen tijdens het definiëren ervan, of zelfs de zichtbaarheid van methoden kunnen veranderen tijdens het overerven ervan.
Laten we nu eens kijken wat Ruby 2.7 kan doen in termen van het veranderen van de zichtbaarheid van aliassen en accessors.
klasse Foo
privé attr_accessor :awesome_variable
einde
Helaas krijgen we een foutmelding omdat de private methode symbols en attr_accessor verwacht. De code retourneert nil en dus is deze methode niet compatibel met het private gebruik in Ruby 2.7. Dus wat zijn onze opties?
We kunnen attr_accessor gebruiken onder het private keyword om het te laten werken, d.w.z. we krijgen een foutmelding als we willen verwijzen naar de ontzagwekkende_variabele ontzagwekkende_variabele methode.
klasse Foo
privé
attr_accessor :awesome_variable
einde
De tweede optie is om de private methode uit te voeren op methoden die gegenereerd worden door attr_attribuut; in dit geval moeten we er ook aan denken om de setter daar in te voeren.
klasse Foo
attr_accessor :awesome_variable
privé :awesome_variable, :awesome_variable=
einde
Problemen met de attr_ * methoden zijn niet de enige obstakels. We kunnen hetzelfde probleem tegenkomen als we een privé alias willen maken.
klasse Foo
privé alias :bar, :awesome_bar
einde
Ruby 3.0 en ons bedrijf
Gelukkig introduceert Ruby 3.0 een grote verandering, aangezien de zichtbaarheidsmethoden array als argument kunnen nemen en methoden alias, attr_ *, de array kan resetten met de namen van de methoden die zijn gedefinieerd. Je kunt meer lezen hier.
Laten we nu enkele voorbeelden bekijken in de nieuwste euba en controleren of de wijzigingen daadwerkelijk zijn doorgevoerd en hoe we ze kunnen gebruiken. In het eerste voorbeeld gebruiken we private voor attr accessor:
klasse Foo
privé attr_accessor :awesome_variable
einde
Een dergelijke aanroep zal geen fouten veroorzaken bij het parsen van de syntaxis en, wat belangrijk is, de ontzagwekkende_variabele enontzagwekkende_variabele =worden methoden privé. De aliasmethode doet hetzelfde, maar geeft nu ook een symbool terug als de naam van de nieuwe methode en maakt deze zichtbaar.
klasse Foo
privé alias :bar, :awesome_bar
einde
Een interessant feit is dat we ons ook kunnen verdiepen in andere methoden, bijvoorbeeld de geweldigeafdrukmodule kan worden aangeroepen tussen privé en attrlezer; het is belangrijk dat zo'n methode een array retourneert met de namen van de methoden die aan de rechterkant van de expressie staan.
Klasse Module
def ontzagwekkend_afdrukken(namen)
zet namen
namen
einde
einde
klasse Foo
privé awesome_print attr_reader :awesome_bar
einde
Samenvatting
Hopelijk vind je dit artikel nuttig! In het geval van meer nieuws over Ruby 3.0. lees meer hier.