(functie(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Auteur op The Codest - Pagina 13 van 13

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 waar komt het us?

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 eens kijken naar 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?

  1. 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
  1. 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.

Veel plezier met coderen!

Ruby Ontwikkelaar Aanbod

Lees meer:

Hou je mond en neem je geld #1: Verborgen kosten en echte flexibiliteit in het productontwikkelingsproces

CTO uitdagingen - schaalvergroting en groei van softwareproducten

nl_NLDutch