Ruby 3.0. Ruby ja vähemtuntud privaatsuskontrolli meetodid
Tomasz Szkaradek
Arendusarhitekt
Ruby üks armastatumaid omadusi on selle väga paindlik süntaks. Mulle isiklikult meeldib Ruby selle eest, kui palju võimalusi meil on klasside ja nende omaduste defineerimisel, ja seda ma ka käesolevas artiklis arutan.
Põhilahendused
Oletame, et kasutame klassi Foo, millel on üks avalik meetod ja üks privaatne meetod:
klass Foo
def bar
:awesome
end
private
def baz
:something_private
end
end
Kõik on suurepärane, me näeme sellist lahendust praktiliselt igas projekt. Käivitus Foo.new.baz põhjustab vea NoMethodError (privaatne meetod 'baz', mis on kutsutud # jaoks ) ja seda me kavatsesime teha. Mis juhtub, kui me üritame salvestusformaati muuta ja lisada klassi definitsioonis eesliite private?
klass Foo
def bar
:awesome
end
private def baz
:something_private
end
end
Nagu näete pärast programmi kood, see tegelikult töötab! Miks me saame sisestada meetodi nähtavuse enne selle tegemist? Sest meetodi defineerimisel tagastab def meetodi nime sümbolina. See väljend ei ole ainult osa süntaksist, vaid de facto meetod, mis on tuletatud Module klassist ja käsitleb seda sümbolit argumendina. Lisateavet leiate dokumentatsioonist sellel lingil. Kuna see algas nii lihtsalt private'iga, siis proovime muuta privaatse meetodi nähtavust.
klass Foo
def bar
:awesome
end
private def baz
:something_private
end
public :baz
end
Mis juhtub pärast koodi käivitamist?
irb(main):012:0> Foo.new.baz
=> :midagi_privaatne
Edu! Meie meetodi alused said avalikuks, sest me tegime selle kaks korda nähtavaks. Loomulikult kehtib sama toiming ka moodulite kohta. Suurepärane, aga kuhu see meid viib? See funktsionaalsus annab meile palju, sest me saame meetodi määratlemisel vabalt muuta meetodi nähtavust või isegi meetodite nähtavust nende pärimisel.
Nüüd vaatame, mida Ruby 2.7 suudab teha aliaside ja aktsessorite nähtavuse muutmise osas.
klass Foo
private attr_accessor :awesome_variable
end
Kahjuks saame vea, kuna privaatne meetod ootab sümboleid ja attr_accessor. Kood tagastab nil ja seega ei ühildu see meetod Ruby 2.7 privaatse kasutusega. Millised on siis meie võimalused?
Me saame kasutada attr_accessor võtmesõna private all, et see toimiks, st me saame vea, kui me tahame viidata awesome_variableawesome_variable meetod.
klass Foo
private
attr_accessor :awesome_variable
end
Teine võimalus on käivitada privaatne meetod meetodite poolt genereeritud meetodite attr_attribuut; sel juhul peame me ka meeles pidama, et sisestame sinna seadistaja.
klass Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
end
Probleemid attr_ * meetodid ei ole ainsad takistused. Sama raskusega võime kokku puutuda ka siis, kui tahame luua privaatse varjunime.
klass Foo
private alias :bar, :awesome_bar
end
Ruby 3.0 ja meie äri
Õnneks toob Ruby 3.0 suure muudatuse, kuna nähtavuse meetodid võivad võtta argumendina massiivi ja meetodite alias, attr_ *, saab massiivi nullida defineeritud meetodite nimedega. Saate lugeda rohkem siin.
Nüüd vaatame mõned näited viimases eubas ja kontrollime, kas muudatused on tegelikult tehtud ja kuidas me saame neid kasutada. Esimeses näites kasutame enne attr accessori private:
klass Foo
private attr_accessor :awesome_variable
end
Selline üleskutse ei põhjusta vigu süntaksi lahtimõtestamisel ja mis on oluline, et awesome_variable jaawesome_variable =meetodid muutuvad privaatseks. Alias meetod teeb sama, sest nüüd tagastab ta ka sümboli uue meetodi nimena ja teeb selle nähtavaks.
klass Foo
private alias :bar, :awesome_bar
end
Huvitav on see, et me võime süveneda ka edasistesse meetoditesse, nt vingeprint-moodulit saab kutsuda private ja attr vahel.lugeja; oluline on, et selline meetod tagastab massiivi nende meetodite nimedega, mis on väljendi paremal poolel.
klass Moodul
def awesome_print(nimed)
puts names
names
end
end
klass Foo
private awesome_print attr_reader :awesome_bar
end
Kokkuvõte
Loodan, et see artikkel on teile kasulik! Ruby 3.0 kohta rohkem uudiseid. loe lähemalt siin.