(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, höfundur hjá The Codest - Síða 13 af 13

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

Hvað mun gerast eftir að kóðanum er keyrt?

irb(main):012:0> Foo.new.baz
=> :something_private

Á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ð?

  1. 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
  1. Ö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.

Gleðilega forritun!

Tilboð fyrir Ruby-þróunaraðila

Lesa meira:

Þegðu og taktu peningana þína #1: Falinn kostnaður og raunveruleg sveigjanleiki í vöruþróunarferli

CTO áskoranir – stækkun og vöxtur hugbúnaðarafurða

is_ISIcelandic