Métodos particulares em Ruby:
Se um método é privado no Ruby, ele não pode ser chamado por um receptor explícito (objeto). Só pode ser chamado implicitamente. Pode ser chamado implicitamente pela classe em que foi descrita, bem como pelas subclasses dessa classe.
Os exemplos a seguir ilustrarão melhor:
1) Uma classe Animal com método privado class_name
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
Nesse caso:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Uma subclasse de Animal chamada Amphibian:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
Nesse caso:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Como você pode ver, os métodos privados podem ser chamados apenas implicitamente. Eles não podem ser chamados por receptores explícitos. Pelo mesmo motivo, métodos privados não podem ser chamados fora da hierarquia da classe de definição.
Métodos protegidos em Ruby:
Se um método estiver protegido no Ruby, ele poderá ser chamado implicitamente pela classe de definição e por suas subclasses. Além disso, eles também podem ser chamados por um receptor explícito, desde que o receptor seja próprio ou da mesma classe que o próprio:
1) Uma classe Animal com 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
Nesse caso:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Uma classe de mamíferos herdada da classe de animais
class Mammal < Animal
def mammal_call
protect_me
end
end
Nesse caso
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Uma classe de anfíbios herdada da classe Animal (igual à classe de mamíferos)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
Nesse caso
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Uma classe chamada Árvore
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
Nesse caso:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
tivessem permissão para chamar os métodos privados de todas as outras instânciasObject
, seria possível dizer coisas como5.puts("hello world")
.