Ruby 3.0. Ruby og mindre kendte metoder til kontrol af privatlivets fred
Tomasz Szkaradek
Udviklingsarkitekt
En af de mest elskede funktioner i Ruby er dens meget fleksible syntaks. Personligt elsker jeg Ruby for de mange muligheder, vi har for at definere klasser og deres egenskaber, og det er det, jeg vil diskutere i denne artikel.
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. Fint, men hvor fører det os hen? 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?
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
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.