(function(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, Forfatter på The Codest - Side 13 af 13

Grundlæggende løsninger

Lad os antage, at vi bruger klassen Foo, som har en offentlig metode og en privat metode:

klasse Foo
  def bar
    :fantastisk
  end

  privat

  def baz
    :noget_privat
  slut
slut

Alt er godt, vi ser en sådan løsning i stort set alle projekt. Løb Foo.new.baz vil forårsage fejlen NoMethodError (privat metode 'baz' kaldet for # ) og det var det, vi havde tænkt os at gøre. Hvad sker der, hvis vi prøver at ændre gemmeformatet og tilføjer private som præfiks i klassedefinitionen?

klasse Foo
  def bar
    :fantastisk
  end

  privat def baz
    :noget_privat
  end
slut

Som du kan se, når du har kørt Kodedet virker faktisk! Hvorfor kan vi indtaste metodens synlighed, før vi gør det? Fordi når man definerer en metode, returnerer def navnet på metoden som et symbol. Dette udtryk er ikke kun en del af syntaksen, men de facto en metode, der er afledt af Module-klassen og behandler dette symbol som et argument. For mere information, se venligst dokumentationen i dette link. Da det startede så nemt med private, så lad os prøve at ændre synligheden af den private metode.

klasse Foo
  def bar
    :fantastisk
  end

  privat def baz
    :noget_privat
  end

  offentlig :baz
end

Hvad sker der, når du har kørt koden?

irb(main):012:0> Foo.new.baz
=> :noget_privat

Det lykkedes! Vores basemetode er blevet offentlig, fordi vi har gjort den synlig to gange. Det samme gælder selvfølgelig for modulerne.

Fantastisk, men hvor bliver den af? os?

Denne funktionalitet giver os meget, fordi vi frit kan ændre synligheden af en metode, mens vi definerer den, eller endda ændre synligheden af metoder, når vi arver dem.

Lad os nu se på, hvad Ruby 2.7 kan gøre med hensyn til at ændre synligheden af aliaser og accessorer.

klasse Foo
  privat attr_accessor :awesome_variable
slut

Desværre får vi en fejl, da den private metode forventer symbols og attr_accessor. Koden returnerer nil, og dermed er denne metode ikke kompatibel med den private brug i Ruby 2.7. Så hvad er vores muligheder?

  1. Vi kan bruge attr_accessor under private-nøgleordet for at få det til at fungere, dvs. vi vil få en fejl, når vi vil henvise til fantastisk_variabel fantastisk_variabel metode.
klasse Foo
  privat

  attr_accessor :awesome_variable
slut
  1. Den anden mulighed er at udføre den private metode på metoder, der er genereret af attr_attribut; i dette tilfælde skal vi også huske at indtaste setteren der.
klasse Foo
  attr_accessor :awesome_variable

  privat :awesome_variable, :awesome_variable=
slut

Problemer med attr_ *. metoder er ikke de eneste forhindringer. Vi kan støde på samme problem, når vi vil oprette et privat alias.

klasse Foo
  privat alias :bar, :awesome_bar
slut

Ruby 3.0 og vores forretning

Heldigvis introducerer Ruby 3.0 en stor ændring, da synlighedsmetoderne kan tage et array som argument, og metodernes alias, attr_ *, kan nulstille arrayet med navnene på de metoder, der er blevet defineret. Du kan læse mere her.

Lad os nu se nogle eksempler i den seneste euba og tjekke, om ændringerne rent faktisk er blevet foretaget, og hvordan vi kan bruge dem.

I det første eksempel bruger vi private før attr accessor:

klasse Foo
  privat attr_accessor :awesome_variable
slut

Et sådant kald vil ikke forårsage fejl i analysen af syntaksen, og hvad der er vigtigt er, at fantastisk_variabel ogawesome_variable = fantastisk_variabelmetoder bliver private.

Alias-metoden gør det samme, men nu returnerer den også et symbol som navn på den nye metode og gør den synlig.

klasse Foo
  privat alias :bar, :awesome_bar
slut

En interessant kendsgerning er, at vi også kan dykke ned i yderligere metoder, f.eks. den fantastiskeprintmodul kan kaldes mellem private og attrDet er vigtigt, at en sådan metode returnerer et array med navnene på de metoder, der står på højre side af udtrykket.

klasse Modul
  def awesome_print(navne)
    sætter navne ind
    navne
  slut
slut
klasse Foo
  privat awesome_print attr_reader :awesome_bar
end 

Sammenfatning

Jeg håber, du vil finde denne artikel nyttig! I tilfælde af flere nyheder om Ruby 3.0. læs mere her.

God fornøjelse med kodningen!

Ruby-udvikler-tilbud

Læs mere om det:

Hold kæft og tag dine penge #1: Skjulte omkostninger og ægte agilitet i produktudviklingsprocessen

CTO-udfordringer - opskalering og vækst af softwareprodukter

da_DKDanish