Ruby 3.0. Ruby ja vähemmän tunnetut yksityisyyden valvontamenetelmät
Tomasz Szkaradek
Kehitysarkkitehti
Yksi Rubyn rakastetuimmista ominaisuuksista on sen erittäin joustava syntaksi. Itse rakastan Rubya sen vuoksi, miten paljon mahdollisuuksia meillä on määritellä luokkia ja niiden ominaisuuksia, ja juuri tätä aion käsitellä tässä artikkelissa.
Perusratkaisut
Oletetaan, että käytämme luokkaa Foo, jolla on yksi julkinen metodi ja yksi yksityinen metodi:
luokka Foo
def bar
:awesome
end
private
def baz
:jotain_yksityistä
end
end
Kaikki on hienoa, näemme tällaisen ratkaisun lähes jokaisessa projekti. Käynnissä Foo.new.baz aiheuttaa virheen NoMethodError (yksityinen menetelmä 'baz' kutsuttu #:lle ) ja niin meidän oli tarkoitus tehdä. Mitä tapahtuu, jos yritämme muuttaa tallennusmuotoa ja lisätä luokan määritelmään etuliitteen private?
luokka Foo
def bar
:awesome
end
private def baz
:jotain_yksityistä
end
end
Kuten näet, kun olet suorittanut koodi, se todella toimii! Miksi voimme syöttää menetelmän näkyvyyden ennen sen tekemistä? Koska metodia määritettäessä def palauttaa metodin nimen symbolina. Tämä lauseke ei ole vain osa syntaksia, vaan de facto menetelmä, joka on johdettu Module-luokasta ja joka käsittelee tätä symbolia argumenttina. Lisätietoja on dokumentaatiossa tässä linkissä. Koska se alkoi niin helposti private-metodilla, yritetään muuttaa private-metodin näkyvyyttä.
luokka Foo
def bar
:awesome
end
private def baz
:jotain_yksityistä
end
public :baz
end
Menestys! Perusmenetelmämme tuli julkiseksi, koska teimme sen näkyväksi kahdesti. Sama toiminto pätee tietysti myös moduuleihin. Hienoa, mutta mihin se johtaa? Tämä toiminnallisuus antaa meille paljon, koska voimme vapaasti muuttaa metodin näkyvyyttä määriteltäessä sitä tai jopa muuttaa metodien näkyvyyttä periytettäessä niitä.
Katsotaanpa nyt, mitä Ruby 2.7 voi tehdä aliasien ja accessoreiden näkyvyyden muuttamisen suhteen.
luokka Foo
private attr_accessor :awesome_variable
end
Valitettavasti saamme virheen, koska yksityinen menetelmä odottaa symboleja ja attr_accessoria. Koodi palauttaa nil:n, joten tämä metodi ei ole yhteensopiva Ruby 2.7:n private-käytön kanssa. Mitkä ovat siis vaihtoehtomme?
Voimme käyttää attr_accessoria private-avainsanan alla saadaksemme sen toimimaan, eli saamme virheen, kun haluamme viitata avainsanaan mahtava_muuttuja mahtava_muuttuja menetelmä.
luokka Foo
private
attr_accessor :awesome_variable
end
Toinen vaihtoehto on suorittaa yksityinen metodi metodeissa, jotka on luotu attr_attribuutti; tässä tapauksessa meidän on myös muistettava syöttää asetin sinne.
luokka Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
end
Ongelmat attr_ * menetelmät eivät ole ainoat esteet. Samaan vaikeuteen törmäämme, kun haluamme luoda yksityisen aliaksen.
luokka Foo
private alias :bar, :awesome_bar
end
Ruby 3.0 ja liiketoimintamme
Onneksi Ruby 3.0 tuo suuren muutoksen, sillä näkyvyysmetodit voivat ottaa argumenttina array:n ja metodien alias, attr_ *, voi nollata array:n määritettyjen metodien nimillä. Voit lukea lisää täällä.
Katsotaanpa nyt muutamia esimerkkejä uusimmasta eubasta ja tarkistetaan, onko muutokset todella tehty ja miten voimme käyttää niitä. Ensimmäisessä esimerkissä käytetään private ennen attr-käyttäjää:
luokka Foo
private attr_accessor :awesome_variable
end
Tällainen kutsu ei aiheuta virheitä syntaksin jäsentämisessä ja, mikä on tärkeää, että awesome_variable jaawesome_variable =menetelmistä tulee yksityisiä. Alias-metodi tekee saman, mutta nyt se myös palauttaa symbolin uuden metodin nimeksi ja tekee sen näkyväksi.
luokka Foo
private alias :bar, :awesome_bar
end
Mielenkiintoinen seikka on, että voimme myös syventyä muihin menetelmiin, esimerkiksi mahtavaantulostusmoduulia voidaan kutsua private- ja attr-moduulien välillä.lukija; on tärkeää, että tällainen metodi palauttaa joukon, jossa on lausekkeen oikealla puolella olevien metodien nimet.
luokka Module
def awesome_print(nimet)
puts names
names
end
end
luokka Foo
private awesome_print attr_reader :awesome_bar
end
Yhteenveto
Toivottavasti löydät tämän artikkelin hyödylliseksi! Jos haluat lisätietoja Ruby 3.0:sta, lue lisää. täällä.