Rubīns 3.0. Ruby un mazāk zināmas privātuma kontroles metodes
Tomasz Szkaradek
Attīstības arhitekts
Viena no iecienītākajām Ruby iezīmēm ir tā ļoti elastīgā sintakse. Personīgi es mīlu Ruby par to, cik daudz iespēju mums ir definēt klases un to īpašības, un tieši par to es runāšu šajā rakstā.
Pamata risinājumi
Pieņemsim, ka mēs izmantojam klasi Foo, kurai ir viena publiskā metode un viena privātā metode:
klase Foo
def bar
:awesome
beigas
privāts
def baz
:something_private
beigas
end
Viss ir lieliski, mēs redzam šādu risinājumu praktiski katrā projekts. Darbojas Foo.new.baz izraisīs kļūdu NoMethodError (privātā metode ‘baz’ izsaukta # ) un to mēs arī gribējām darīt. Kas notiks, ja mēs mēģināsim mainīt saglabāšanas formātu un klases definīcijā kā prefiksu pievienosim private?
klase Foo
def bar
:awesome
beigas
privāts def baz
:something_private
end
end
Kā redzat pēc kods, tas patiešām darbojas! Kāpēc mēs varam ievadīt metodes redzamību pirms tās veikšanas? Tāpēc, ka, definējot metodi, def atgriež metodes nosaukumu kā simbolu. Šī izteiksme ir ne tikai sintakses daļa, bet de facto metode, kas atvasināta no klases Module un šo simbolu uzskata par argumentu. Lai iegūtu vairāk informācijas, lūdzu, skatiet dokumentāciju šajā saitē. Tā kā ar privāto metodi tas sākās tik vienkārši, mēģināsim mainīt privātās metodes redzamību.
klase Foo
def bar
:awesome
beigas
privāts def baz
:something_private
end
public :baz
end
Panākumi! Mūsu bāzu metode kļuva publiski pieejama, jo mēs to padarījām redzamu divreiz. Protams, tāda pati darbība attiecas arī uz moduļiem. Lieliski, bet kur tas nokļūst mums? Šī funkcionalitāte dod mums daudz, jo mēs varam brīvi mainīt metodes redzamību, to definējot, vai pat mainīt metožu redzamību, tās mantojot.
Tagad aplūkosim, ko Rubīns 2.7 var mainīt aizstājvārdu un piekļuves vārdu redzamību.
klase Foo
privātais attr_accessor :awesome_variable
beigas
Diemžēl tiek pieļauta kļūda, jo privātā metode sagaida simbolus un attr_accessor. Kods atgriež nil, un tādējādi šī metode nav saderīga ar Ruby 2.7 privāto izmantošanu. Kādas ir mūsu iespējas?
Mēs varam izmantot attr_accessor zem atslēgvārda private, lai tas darbotos, t. i., mēs saņemsim kļūdu, kad mēs gribēsim atsaukties uz lielisks_mainīgaislielisks_mainīgais metode.
klase Foo
privāts
attr_accessor :awesome_variable
beigas
Otra iespēja ir izpildīt privāto metodi metodēm, ko ģenerē attr_attribute; šajā gadījumā mums arī jāatceras, ka tur ir jāievada iestatītājs.
klase Foo
attr_accessor :awesome_variable
privāts :awesome_mainīgais, :awesome_mainīgais=
end
Problēmas ar attr_ * metodes nav vienīgie šķēršļi. Ar tādām pašām grūtībām varam saskarties, ja vēlamies izveidot privātu aizstājvārdu.
klase Foo
privātais alias :bar, :awesome_bar
beigas
Ruby 3.0 un mūsu uzņēmējdarbība
Par laimi, Ruby 3.0 ievieš lielas izmaiņas, jo redzamības metodes var pieņemt masīvu kā argumentu, un metožu alias, attr_ *, var atjaunot masīvu ar definēto metožu nosaukumiem. Jūs varat lasīt vairāk šeit.
Tagad aplūkosim dažus piemērus jaunākajā euba versijā un pārbaudīsim, vai izmaiņas patiešām ir veiktas un kā mēs tās varam izmantot. Pirmajā piemērā izmantosim private pirms attr accessor:
klase Foo
privātais attr_accessor :awesome_variable
beigas
Šāds izsaukums neradīs sintakses analīzes kļūdas, un, kas ir svarīgi. awesome_mainīgais unlielisks_mainīgais =metodes kļūst privātas. Tāda pati būs arī alias metode, jo tagad tā arī atgriež simbolu kā jaunās metodes nosaukumu un padara to redzamu.
klase Foo
privātais alias :bar, :awesome_bar
beigas
Interesanti ir tas, ka mēs varam izmantot arī citas metodes, piemēram, lieliskoprint moduli var izsaukt starp private un attrlasītājs; ir svarīgi, lai šāda metode atgrieztu masīvu ar metožu nosaukumiem, kas ir izteiksmes labajā pusē.
klase Modulis
def awesome_print(names)
puts names
names
end
end
klase Foo
private awesome_print attr_reader :awesome_bar
end
Kopsavilkums
Ceru, ka šis raksts jums būs noderīgs! Ja ir vairāk ziņu par Ruby 3.0. lasīt vairāk šeit.