Metody prywatne w Rubim:
Jeśli metoda jest prywatna w Rubim, to nie może być wywołana przez jawnego odbiorcę (obiekt). Można to wywołać tylko niejawnie. Może być wywoływana niejawnie przez klasę, w której została opisana, jak również przez jej podklasy.
Poniższe przykłady zilustrują to lepiej:
1) Klasa Animal z prywatną metodą nazwa_klasy
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
W tym przypadku:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Podklasa zwierząt zwanych płazami:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
W tym przypadku:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Jak widać, metody prywatne można wywołać tylko niejawnie. Nie mogą być wywoływane przez jawnych odbiorców. Z tego samego powodu metody prywatne nie mogą być wywoływane poza hierarchią klasy definiującej.
Metody chronione w Rubim:
Jeśli metoda jest chroniona w Rubim, to może zostać wywołana niejawnie zarówno przez klasę definiującą, jak i jej podklasy. Dodatkowo mogą być wywoływane przez jawnego odbiorcę, o ile odbiorca jest sobą lub jest tej samej klasy co ja:
1) Klasa Animal z chronioną metodą protect_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
W tym przypadku:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Klasa ssaków dziedziczona z klasy zwierząt
class Mammal < Animal
def mammal_call
protect_me
end
end
W tym przypadku
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Klasa płazów dziedziczona z klasy zwierząt (taka sama jak klasa ssaków)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
W tym przypadku
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Klasa o nazwie Drzewo
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
W tym przypadku:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
mogły wywoływać prywatne metody każdego innego wystąpieniaObject
, można by było powiedzieć takie rzeczy jak5.puts("hello world")
.