Métodos privados en Ruby:
Si un método es privado en Ruby, entonces no puede ser invocado por un receptor explícito (objeto). Solo se puede llamar implícitamente. Se puede llamar implícitamente por la clase en la que se ha descrito, así como por las subclases de esta clase.
Los siguientes ejemplos lo ilustrarán mejor:
1) Una clase Animal con método privado class_name
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
En este caso:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Una subclase de Animal llamada Anfibio:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
En este caso:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Como puede ver, los métodos privados solo se pueden invocar implícitamente. No pueden ser llamados por receptores explícitos. Por la misma razón, los métodos privados no se pueden invocar fuera de la jerarquía de la clase definitoria.
Métodos protegidos en Ruby:
Si un método está protegido en Ruby, la clase definitoria y sus subclases pueden invocarlo implícitamente. Además, también pueden ser llamados por un receptor explícito siempre que el receptor sea propio o de la misma clase que el propio:
1) Una clase Animal con método protegido protect_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
En este caso:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Una clase de mamífero que se hereda de la clase animal.
class Mammal < Animal
def mammal_call
protect_me
end
end
En este caso
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Una clase de anfibios heredada de la clase Animal (igual que la clase mamífero)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
En este caso
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Una clase llamada Árbol
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
En este caso:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
se permitiera a todas las instancias llamar a los métodos privados de cualquier otra instancia deObject
, sería posible decir cosas como5.puts("hello world")
.