Ruby 3.0. Ruby og minna þekktar aðferðir til stjórnunar persónuverndar
Tomasz Szkaradek
Þróunarskipulagsarkitekt
Ein af ástsælustu eiginleikum Ruby er afar sveigjanleg setningagerð hennar. Persónulega elska ég Ruby fyrir hversu margar möguleikar við höfum til að skilgreina flokka og eiginleika þeirra, og um það mun ég fjalla í þessari grein.
Hér er tómt.
Grunnlausnir
Segjum að við séum að nota class Foo sem hefur eina almenna aðferð og eina einkaaðferð:
class Foo
def bar
:awesome
end
private
def baz
:something_private
end
end
Allt er frábært, við sjáum slíka lausn í nánast hverju verkefni. Hlaup Foo.new.baz mun valda villunni NoMethodError (einkaaðferðin ‘baz’ kölluð fyrir #) og það var einmitt það sem við ætluðum að gera. Hvað gerist ef við reynum að breyta sniðinu fyrir vistun og bæta við private sem forlið í flokksskilgreiningunni?
class Foo
def bar
:awesome
end
private def baz
:something_private
end
end
Eins og þú sérð eftir að hafa keyrt kóði, þetta virkar reyndar! Hvers vegna getum við komist inn í sýnileika aðferðarinnar áður en við framkvæmum hana? Vegna þess að þegar aðferð er skilgreind skilar `def` nafni aðferðarinnar sem tákni. Þetta tjáning er ekki aðeins hluti af málfarinu, heldur de facto aðferð sem er afleiðing `Module`-flokksins og meðhöndlar þetta tákn sem rök. Fyrir frekari upplýsingar, sjáðu skjölin. í þessum hlekk. Þar sem þetta byrjaði svo auðveldlega með private, skulum við reyna að breyta sýnileika private-aðferðarinnar.
class Foo
def bar
:awesome
end
private def baz
:something_private
end
public :baz
end
Árangur! Aðferð okkar við grunnlínur varð opinber vegna þess að við gerðum hana sýnilega tvisvar. Auðvitað gildir sama aðgerð um einingarnar. Frábært, en hvar fær það? okkur? Þessi virkni gefur okkur mikið, því við getum frjálslega breytt sýnileika aðferðar á meðan við skilgreinum hana, eða jafnvel breytt sýnileika aðferða þegar við erfum þær.
Nú skulum við líta á hvað Rúbín 2.7 getur gert varðandi að breyta sýnileika aliasa og aðgangsbreyta.
class Foo
private attr_accessor :awesome_variable
end
Því miður fáum við villu þar sem einkametóði gerir ráð fyrir táknum og attr_accessor. Kóðinn skilar nil og þess vegna er þessi aðferð ekki samhæfð einkanotkun í Ruby 2.7. Hvaða valkosti höfum við?
Við getum notað attr_accessor undir lykilorðinu private til að láta það virka, þ.e. við fáum villu þegar við reynum að vísa til frábær_breytilegfrábær_breytileg aðferð.
class Foo
private
attr_accessor :awesome_variable
end
Önnur kosturinn er að framkvæma einkavaðferðina á aðferðum sem búið er til af eiginleiki_eiginleiki; í þessu tilfelli verðum við líka að muna að setja setterinn þar inn.
class Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
end
Vandamál með eiginleiki_ * Aðferðirnar eru ekki einu hindranirnar. Við getum lent í sömu erfiðleikum þegar við viljum búa til einkannaf.
class Foo
private alias :bar, :awesome_bar
end
Ruby 3.0 og fyrirtækið okkar
Sem betur fer kynnir Ruby 3.0 mikla breytingu þar sem sýnileikaraðferðir geta tekið fylki sem rök og aðferðir eins og alias og attr_* geta endurstillt fylkið með nöfnum þeirra aðferða sem hafa verið skilgreindar. Þú getur lesið meira hér.
Nú skulum við skoða nokkur dæmi í nýjustu euba og athuga hvort breytingarnar hafi í raun verið gerðar og hvernig við getum notað þær. Í fyrsta dæminu skulum við nota private fyrir framan attr-aðgangaraðila:
class Foo
private attr_accessor :awesome_variable
end
Slík köllun mun ekki valda villum við greiningu setningarfræðinnar og, sem skiptir máli, frábær_breytilegur ogawesome_variable =aðferðir verða einkaaðferðir. alias-aðferðin gerir það sama og áður; hún skilar nú einnig tákni sem nafni nýrrar aðferðar og gerir hana sýnilega.
class Foo
private alias :bar, :awesome_bar
end
Áhugaverð staðreynd er að við getum einnig kafað dýpra í frekari aðferðir, t.d. hið frábæraprent-einingu má kalla á milli private og attrlesari; það er mikilvægt að slík aðferð skili fylki með nöfnum aðferðanna sem eru til hægri í tjáningunni.
class Module
def awesome_print(names)
puts names
names
end
end
class Foo
private awesome_print attr_reader :awesome_bar
end
Yfirlit
Vonandi finnur þú þessa grein gagnlega! Ef fleiri fréttir berast um Ruby 3.0, lestu meira. hér.