Ruby 3.0. Ruby e i metodi di controllo della privacy meno conosciuti
Tomasz Szkaradek
Architetto dello sviluppo
Una delle caratteristiche più amate di Ruby è la sua sintassi molto flessibile. Personalmente, amo Ruby per le numerose possibilità che abbiamo di definire le classi e le loro proprietà, ed è di questo che parlerò in questo articolo.
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 ci porta? 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.
Vediamo ora cosa può fare Ruby 2.7 in termini di modifica della visibilità di alias e accessor.
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?
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
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.