Private Methoden in Ruby:
Wenn eine Methode in Ruby privat ist, kann sie nicht von einem expliziten Empfänger (Objekt) aufgerufen werden. Es kann nur implizit aufgerufen werden. Es kann implizit von der Klasse, in der es beschrieben wurde, sowie von den Unterklassen dieser Klasse aufgerufen werden.
Die folgenden Beispiele veranschaulichen dies besser:
1) Eine Tierklasse mit der privaten Methode class_name
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
In diesem Fall:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Eine Unterklasse von Tieren namens Amphibien:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
In diesem Fall:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Wie Sie sehen, können private Methoden nur implizit aufgerufen werden. Sie können nicht von expliziten Empfängern aufgerufen werden. Aus dem gleichen Grund können private Methoden nicht außerhalb der Hierarchie der definierenden Klasse aufgerufen werden.
Geschützte Methoden in Ruby:
Wenn eine Methode in Ruby geschützt ist, kann sie implizit sowohl von der definierenden Klasse als auch von ihren Unterklassen aufgerufen werden. Zusätzlich können sie auch von einem expliziten Empfänger aufgerufen werden, solange der Empfänger selbst oder von derselben Klasse wie der von sich selbst ist:
1) Eine Tierklasse mit der geschützten Methode protected_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
In diesem Fall:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Eine Säugetierklasse, die von der Tierklasse geerbt wird
class Mammal < Animal
def mammal_call
protect_me
end
end
In diesem Fall
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Eine Amphibienklasse, die von der Tierklasse geerbt wurde (wie die Säugetierklasse)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
In diesem Fall
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Eine Klasse namens Tree
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
In diesem Fall:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
die privaten Methoden jeder anderen Instanz von aufrufen könntenObject
, wäre es möglich, Dinge wie zu sagen5.puts("hello world")
.