Metodi privati in Ruby:
Se un metodo è privato in Ruby, non può essere chiamato da un destinatario esplicito (oggetto). Può essere chiamato solo implicitamente. Può essere chiamato implicitamente dalla classe in cui è stato descritto, nonché dalle sottoclassi di questa classe.
I seguenti esempi lo illustreranno meglio:
1) Una classe Animal con metodo privato class_name
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
In questo caso:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Una sottoclasse di animali chiamata Anfibio:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
In questo caso:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Come puoi vedere, i metodi privati possono essere chiamati solo implicitamente. Non possono essere chiamati da destinatari espliciti. Per lo stesso motivo, i metodi privati non possono essere chiamati al di fuori della gerarchia della classe di definizione.
Metodi protetti in Ruby:
Se un metodo è protetto in Ruby, può essere chiamato in modo implicito sia dalla classe che dalla sua definizione che dalle sue sottoclassi. Inoltre, possono anche essere chiamati da un destinatario esplicito a condizione che il destinatario sia self o della stessa classe di quello self:
1) Una classe di animali con metodo protetto protect_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
In questo caso:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Una classe di mammiferi ereditata da una classe animale
class Mammal < Animal
def mammal_call
protect_me
end
end
In questo caso
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Una classe di anfibi ereditata dalla classe Animale (uguale alla classe dei mammiferi)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
In questo caso
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Una classe chiamata Albero
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
In questo caso:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
fossero autorizzate a chiamare i metodi privati di ogni altra istanza diObject
, sarebbe possibile dire cose del genere5.puts("hello world")
.