(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, Autors pie The Codest - Page 13 of 13

Pamata risinājumi

Pieņemsim, ka mēs izmantojam klasi Foo, kurai ir viena publiskā metode un viena privātā metode:

klase Foo
  def bar
    :awesome
  beigas

  privāts

  def baz
    :something_private
  beigas
end

Viss ir lieliski, mēs redzam šādu risinājumu praktiski katrā projekts. Darbojas Foo.new.baz izraisīs kļūdu NoMethodError (privātā metode ‘baz’ izsaukta # ) un to mēs arī gribējām darīt. Kas notiks, ja mēs mēģināsim mainīt saglabāšanas formātu un klases definīcijā kā prefiksu pievienosim private?

klase Foo
  def bar
    :awesome
  beigas

  privāts def baz
    :something_private
  end
end

Kā redzat pēc kods, tas patiešām darbojas! Kāpēc mēs varam ievadīt metodes redzamību pirms tās veikšanas? Tāpēc, ka, definējot metodi, def atgriež metodes nosaukumu kā simbolu. Šī izteiksme ir ne tikai sintakses daļa, bet de facto metode, kas atvasināta no klases Module un šo simbolu uzskata par argumentu. Lai iegūtu vairāk informācijas, lūdzu, skatiet dokumentāciju šajā saitē. Tā kā ar privāto metodi tas sākās tik vienkārši, mēģināsim mainīt privātās metodes redzamību.

klase Foo
  def bar
    :awesome
  beigas

  privāts def baz
    :something_private
  end

  public :baz
end

Kas notiks pēc koda palaišanas?

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

Panākumi! Mūsu bāzu metode kļuva publiski pieejama, jo mēs to padarījām redzamu divreiz. Protams, tāda pati darbība attiecas arī uz moduļiem.

Lieliski, bet kur tas nokļūst mums?

Šī funkcionalitāte dod mums daudz, jo mēs varam brīvi mainīt metodes redzamību, to definējot, vai pat mainīt metožu redzamību, tās mantojot.

Tagad aplūkosim, ko Rubīns 2.7 var mainīt aizstājvārdu un piekļuves vārdu redzamību.

klase Foo
  privātais attr_accessor :awesome_variable
beigas

Diemžēl tiek pieļauta kļūda, jo privātā metode sagaida simbolus un attr_accessor. Kods atgriež nil, un tādējādi šī metode nav saderīga ar Ruby 2.7 privāto izmantošanu. Kādas ir mūsu iespējas?

  1. Mēs varam izmantot attr_accessor zem atslēgvārda private, lai tas darbotos, t. i., mēs saņemsim kļūdu, kad mēs gribēsim atsaukties uz lielisks_mainīgaislielisks_mainīgais metode.
klase Foo
  privāts

  attr_accessor :awesome_variable
beigas
  1. Otra iespēja ir izpildīt privāto metodi metodēm, ko ģenerē attr_attribute; šajā gadījumā mums arī jāatceras, ka tur ir jāievada iestatītājs.
klase Foo
  attr_accessor :awesome_variable

  privāts :awesome_mainīgais, :awesome_mainīgais=
end

Problēmas ar attr_ * metodes nav vienīgie šķēršļi. Ar tādām pašām grūtībām varam saskarties, ja vēlamies izveidot privātu aizstājvārdu.

klase Foo
  privātais alias :bar, :awesome_bar
beigas

Ruby 3.0 un mūsu uzņēmējdarbība

Par laimi, Ruby 3.0 ievieš lielas izmaiņas, jo redzamības metodes var pieņemt masīvu kā argumentu, un metožu alias, attr_ *, var atjaunot masīvu ar definēto metožu nosaukumiem. Jūs varat lasīt vairāk šeit.

Tagad aplūkosim dažus piemērus jaunākajā euba versijā un pārbaudīsim, vai izmaiņas patiešām ir veiktas un kā mēs tās varam izmantot.

Pirmajā piemērā izmantosim private pirms attr accessor:

klase Foo
  privātais attr_accessor :awesome_variable
beigas

Šāds izsaukums neradīs sintakses analīzes kļūdas, un, kas ir svarīgi. awesome_mainīgais unlielisks_mainīgais =metodes kļūst privātas.

Tāda pati būs arī alias metode, jo tagad tā arī atgriež simbolu kā jaunās metodes nosaukumu un padara to redzamu.

klase Foo
  privātais alias :bar, :awesome_bar
beigas

Interesanti ir tas, ka mēs varam izmantot arī citas metodes, piemēram, lieliskoprint moduli var izsaukt starp private un attrlasītājs; ir svarīgi, lai šāda metode atgrieztu masīvu ar metožu nosaukumiem, kas ir izteiksmes labajā pusē.

klase Modulis
  def awesome_print(names)
    puts names
    names
  end
end
klase Foo
  private awesome_print attr_reader :awesome_bar
end 

Kopsavilkums

Ceru, ka šis raksts jums būs noderīgs! Ja ir vairāk ziņu par Ruby 3.0. lasīt vairāk šeit.

Laimīgu kodēšanu!

Ruby izstrādātāja piedāvājums

Lasīt vairāk:

#1: Slēptās izmaksas un reāla elastība produktu izstrādes procesā

CTO izaicinājumi - programmatūras produktu paplašināšana un izaugsme

lvLatvian