(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, Autore presso The Codest - Pagina 13 di 13

Soluzioni di base

Supponiamo di utilizzare la classe Foo, che ha un metodo pubblico e uno privato:

classe Foo
  def bar
    :impressionante
  fine

  privato

  def baz
    :qualcosa_privato
  fine
fine

Tutto va benissimo, vediamo una soluzione di questo tipo praticamente in ogni progetto. In esecuzione Foo.new.baz causerà l'errore NoMethodError (metodo privato 'baz' chiamato per # ) ed è quello che intendevamo fare. Cosa succede se proviamo a cambiare il formato di salvataggio e ad aggiungere private come prefisso nella definizione della classe?

classe Foo
  def bar
    :impressionante
  fine

  privato def baz
    :qualcosa_privato
  fine
fine

Come si può vedere dopo aver eseguito il programma codicefunziona davvero! Perché possiamo inserire la visibilità del metodo prima di farlo? Perché quando si definisce un metodo, def restituisce il nome del metodo come simbolo. Questa espressione non è solo una parte della sintassi, ma di fatto un metodo derivato dalla classe Module e che tratta questo simbolo come un argomento. Per ulteriori informazioni, consultare la documentazione in questo link. Dal momento che è iniziato in modo così semplice con private, proviamo a cambiare la visibilità del metodo private.

classe Foo
  def bar
    :impressionante
  fine

  privato def baz
    :qualcosa_privato
  fine

  pubblico :baz
fine

Cosa succede dopo l'esecuzione del codice?

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

Successo! Il nostro metodo delle basi è diventato pubblico perché lo abbiamo reso visibile due volte. Naturalmente, la stessa operazione vale per i moduli.

Ottimo, ma dove arriva noi?

Questa funzionalità ci dà molto perché possiamo cambiare liberamente la visibilità di un metodo mentre lo definiamo, o anche cambiare la visibilità dei metodi quando li ereditiamo.

Ora, diamo un'occhiata a ciò che Rubino 2.7 in termini di modifica della visibilità degli alias e degli accessi.

classe Foo
  private attr_accessor :awesome_variable
fine

Sfortunatamente, si ottiene un errore perché il metodo privato si aspetta simboli e attr_accessor. Il codice restituisce nil e quindi questo metodo non è compatibile con l'uso privato in Ruby 2.7. Quali sono quindi le nostre opzioni?

  1. Possiamo usare attr_accessor sotto la parola chiave private per farlo funzionare, ma otterremo un errore quando vogliamo fare riferimento all'oggetto fantastico_variabile fantastico_variabile metodo.
classe Foo
  privato

  attr_accessor :awesome_variable
fine
  1. La seconda opzione consiste nell'eseguire il metodo privato sui metodi generati da attr_attributoIn questo caso, dobbiamo anche ricordarci di inserire il setter.
classe Foo
  attr_accessor :awesome_variable

  private :awesome_variable, :awesome_variable=
fine

Problemi con il attr_ * non sono gli unici ostacoli. Possiamo incontrare le stesse difficoltà quando vogliamo creare un alias privato.

classe Foo
  alias privati :bar, :awesome_bar
fine

Ruby 3.0 e la nostra attività

Fortunatamente, Ruby 3.0 introduce un grande cambiamento: i metodi di visibilità possono prendere un array come argomento e l'alias dei metodi, attr_ *, può reimpostare l'array con i nomi dei metodi che sono stati definiti. Per saperne di più qui.

Vediamo ora alcuni esempi nell'ultima euba e verifichiamo se le modifiche sono state effettivamente apportate e come possiamo utilizzarle.

Nel primo esempio, utilizziamo l'accessor private prima di attr:

classe Foo
  private attr_accessor :awesome_variable
fine

Una chiamata di questo tipo non causerà errori nell'analisi della sintassi e, cosa importante, l'opzione variabile_fantastica eawesome_variable =diventano privati.

Il metodo alias farà lo stesso, ma ora restituisce anche un simbolo come nome del nuovo metodo e lo rende visibile.

classe Foo
  alias privati :bar, :awesome_bar
fine

Un fatto interessante è che possiamo anche approfondire altri metodi, come ad esempio l'impressionanteIl modulo di stampa può essere chiamato tra private e attrè importante che tale metodo restituisca un array con i nomi dei metodi che si trovano sul lato destro dell'espressione.

classe Modulo
  def awesome_print(nomi)
    mette i nomi
    nomi
  fine
fine
classe Foo
  private awesome_print attr_reader :awesome_bar
fine 

Sintesi

Spero che questo articolo vi sia utile! In caso di ulteriori notizie su Ruby 3.0, leggete di più qui.

Buona codifica!

Offerta per sviluppatori Ruby

Per saperne di più:

Zitto e prendi i tuoi soldi #1: Costi nascosti e reale agilità nel processo di sviluppo del prodotto

CTO sfide - scalabilità e crescita dei prodotti software

it_ITItalian