Che cos’è un metodo privato in Ruby?
È un tipo di metodo che puoi chiamare SOLO dall’interno della classe in cui è definito.
Questo ti permette di controllare l’accesso ai tuoi metodi.
Un metodo Ruby può essere:
- privato
- pubblico (predefinito)
- protetto
Per impostazione predefinita TUTTI i metodi sono public
.
Chiunque può usarli!
Ma puoi cambiarlo, creando un metodo private
o protected
.
Perché è utile?
Perché è possibile rendere questi metodi più facili da modificare.
Immagina di scrivere una libreria di codice che verrà utilizzata in alcuni progetti diversi al lavoro.
Quando questi progetti implementano la tua libreria, chiameranno metodi sulle classi che hai creato.
Ora:
Rilasci una nuova versione
Ma hai deciso di cambiare il nome su un metodo public
.
Questo produrrà errori su ogni progetto che utilizza questo metodo!
Ricorda questo:
Avendo MENO metodi pubblici aumenti la libertà di cambiamento all’interno della tua classe.
Vediamo alcuni esempi di codice!
Comprensione dei metodi privati in Ruby
Hai mai visto il messaggio di errore” metodo privato chiamato”?
Questo:
self.puts 123# NoMethodError: private method `puts' called
Quindi hai provato a utilizzare un metodo private
in modo errato.
È possibile utilizzare solo un metodo privato da solo.
Esempio:
puts 123
È lo stesso metodo, ma devi chiamarlo così.
I metodi privati vengono sempre chiamati nel contesto di self
.
In altre parole…
È possibile utilizzare solo i metodi privati:
- Altri metodi della stessa classe
- Metodi ereditati dalla classe padre
- Metodi incluso da un modulo
Questo significa che non è possibile chiamare i metodi privati da fuori classe che li definisce.
Perché ciò richiederebbe un “ricevitore esplicito”.
A meno che…
Si utilizza un metodo come send
per bypassare questa regola.
send(:puts, "apple")
Come si definisce un metodo private
?
def bacon "private bacon"endprivate :bacon
La parola private
di per sé non è una parola chiave, è un metodo definito sul modulo Kernel
.
Dove mettere i tuoi metodi privati
È normale che una classe abbia più di un metodo privato.
Dove si posizionano questi metodi?
Fai questo:
class Food def public_method end private def bacon end def orange end def coconut endend
Ogni metodo di istanza dopo private
diventa un metodo privato.
È possibile utilizzare
private_class_method :method_name
se si desidera definire un metodo di classe come privato
È un modello comune per definire prima tutti i metodi pubblici, quindi definire i metodi private
insieme alla fine della classe.
Metodi pubblici
Pubblico è la visibilità del metodo predefinito in Ruby.
Ecco un esempio:
def orange "Vitamin C"end
Se hai un oggetto food
che definisce orange
, puoi chiamarlo in questo modo:
food.orange
Se un metodo è stato reso privato o protetto, è possibile renderlo nuovamente pubblico.
public :orange
Che cos’è un metodo protetto?
I metodi protetti sono meno comuni.
Sono come metodi private
, ma puoi chiamarli su un oggetto & non solo direttamente.
Se provi questo esempio con private riceverai un errore:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
Ottieni l’errore perché name
sarebbe privato, quindi non puoi fare other.name
.
Ma con protected
questo codice funziona!
Metodi privati vs protetti
Questa è la differenza, il fatto che protected
mantiene il metodo private
, ma consente anche di chiamare quel metodo su un oggetto.
Con private puoi fare solo name
, con protected puoi fare object.name
.
Quando si deve utilizzare protetto?
Solo se hai un caso molto specifico, come il metodo equals (==
).
La documentazione di Ruby consiglia di utilizzare private
invece di protected
quando possibile.
E c’è questa nota:
“Un metodo protetto è lento perché non può utilizzare la cache inline.”
Ero curioso di questo quindi ho eseguito alcuni benchmark:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
Questa è una differenza di 8.5% in termini di prestazioni.
Video Tutorial
Sommario
Hai imparato a conoscere Ruby method visibility, public, private & protected methods. Queste non sono parole chiave Ruby, sono metodi stessi definiti sulla classe Module
.