Pagrindiniai sprendimai
Tarkime, kad naudojame Foo klasę, kuri turi vieną viešąjį ir vieną privatųjį metodą:
klasė Foo
def bar
:awesome
pabaiga
privatus
def baz
:something_private
pabaiga
end
Viskas puiku, tokį sprendimą matome beveik kiekviename projektas. Veikia Foo.new.baz sukels klaidą NoMethodError (privatus metodas ‘baz’ iškviestas # ) tai ir norėjome padaryti. Kas nutiks, jei bandysime pakeisti išsaugojimo formatą ir į klasės apibrėžtį kaip priešdėlį pridėsime private?
klasė Foo
def bar
:awesome
pabaiga
privatus def baz
:something_private
end
end
Kaip matote, paleidę kodas, jis iš tikrųjų veikia! Kodėl prieš atlikdami metodą galime įvesti jo matomumą? Todėl, kad apibrėžiant metodą def grąžina metodo pavadinimą kaip simbolį. Ši išraiška yra ne tik sintaksės dalis, bet ir de facto metodas, išvestas iš Modulio klasės ir traktuojantis šį simbolį kaip argumentą. Daugiau informacijos rasite dokumentacijoje šioje nuorodoje. Kadangi taip lengvai pradėjome nuo private, pabandykime pakeisti privataus metodo matomumą.
klasė Foo
def bar
:awesome
pabaiga
privatus def baz
:something_private
end
public :baz
end
Kas nutiks paleidus kodą?
irb(main):012:0> Foo.new.baz
=> :something_private
Sėkmė! Mūsų bazių metodas tapo viešas, nes jį padarėme matomą du kartus. Žinoma, ta pati operacija taikoma ir moduliams.
Puiku, bet kur jis patenka mus?
Šis funkcionalumas mums suteikia daug, nes galime laisvai keisti metodo matomumą jį apibrėžiant arba net keisti metodų matomumą juos paveldint.
Dabar pažvelkime į tai, kas Ruby 2.7 gali pakeisti aliasų ir accessorių matomumą.
klasė Foo
privatus attr_accessor :awesome_variable
pabaiga
Deja, gauname klaidą, nes privatus metodas tikisi simbolių ir attr_accessor. Kodas grąžina nil, todėl šis metodas nesuderinamas su "Ruby 2.7" privačiu naudojimu. Taigi kokios yra mūsų galimybės?
- Galime naudoti attr_accessor pagal raktinį žodį private, kad jis veiktų, t. y. gausime klaidą, kai norėsime pateikti nuorodą į
awesome_variableawesome_variablemetodas.
klasė Foo
privatus
attr_accessor :awesome_variable
pabaiga
- Antroji galimybė - vykdyti privatų metodą metodams, sukurtiems
attr_attribute; šiuo atveju taip pat turime nepamiršti įvesti setterį.
klasė Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
end
Problemos, susijusios su atr_ * metodai nėra vienintelės kliūtys. Su tais pačiais sunkumais galime susidurti, kai norime sukurti privatų slapyvardį.
klasė Foo
privatūs slapyvardžiai :bar, :awesome_bar
pabaiga
"Ruby 3.0" ir mūsų verslas
Laimei, "Ruby 3.0" įdiegtas didelis pokytis - matomumo metodai gali priimti masyvą kaip argumentą, o metodų pseudonimas attr_ * gali iš naujo nustatyti masyvą su apibrėžtų metodų pavadinimais. Galite perskaityti daugiau čia.
Dabar pažiūrėkime keletą pavyzdžių naujausioje "euba" versijoje ir patikrinkime, ar pakeitimai iš tikrųjų buvo padaryti ir kaip juos galime naudoti.
Pirmajame pavyzdyje naudokime private prieš attr accessor:
klasė Foo
privatus attr_accessor :awesome_variable
pabaiga
Toks iškvietimas nesukels sintaksės analizės klaidų, o svarbiausia, kad awesome_variable irawesome_variable =metodai tampa privatūs.
Pseudonimo metodas atliks tą patį, nes dabar jis taip pat grąžina simbolį kaip naujo metodo pavadinimą ir padaro jį matomą.
klasė Foo
privatūs slapyvardžiai :bar, :awesome_bar
pabaiga
Įdomu tai, kad galime pasinerti ir į kitus metodus, pvz., nuostabųspausdinimo modulis gali būti iškviestas tarp private ir attrsvarbu, kad toks metodas grąžintų masyvą su dešinėje išraiškos pusėje esančių metodų pavadinimais.
klasė Modulis
def awesome_print(names)
puts names
names
end
end
klasė Foo
private awesome_print attr_reader :awesome_bar
end
Santrauka
Tikimės, kad šis straipsnis jums bus naudingas! Jei yra daugiau naujienų apie Ruby 3.0, skaitykite daugiau čia.
Laimingo kodavimo!

Skaityti daugiau:
Užsičiaupk ir pasiimk pinigus #1: paslėptos išlaidos ir tikrasis produktų kūrimo proceso judrumas
CTO iššūkiai - programinės įrangos produktų masto didinimas ir augimas