Durch das Vorstellen von public, private oder protected
kann man ähnlich wie in anderen Sprachen die Sichtbarkeit von Methoden regeln.
public: Die Methode ist überall verfügbar. Wenn in Klassendefinitionen
nichts anderes angegeben wird, werden bis auf initialize
alle Methoden public.
protected: Die Methode kann nur für die Definition
von Methoden der aktuellen Klasse und ihrer Unterklassen verwendet
werden. Bei einem expliziten Aufruf erhält man einen NameError.
private:
Der Aufruf ist nur mit dem "`impliziten Empfänger"' möglich. Damit
ist gemeint, dass kein Empfänger vor der Methode steht, aber das
aktuelle Objekt self gemeint ist, dessen Methode gerade ausgeführt wird.
Bereits die explizite Angabe von self funktioniert nicht mehr.
Also sind private-Methoden aus der definierenden Klasse und
auch deren Unterklassen verfügbar, aber nur für das jeweils aktuelle
Objekt. initialize ist immer private.
class A
private
def priv; puts "private"; end
protected
def prot; puts "protected"; end
public
def publ; puts "public"; end
def a_priv; priv; end
def a_prot; prot; end
def a_publ; publ; end
def a_fail; self.priv; end # expl. Empfänger
end
a = A.new
a.a_priv #-> private
a.a_prot #-> protected
a.a_publ #-> public
a.a_fail #-> NameError
a.priv #-> NameError
a.prot #-> NameError
a.publ #-> public
class B < A
def b_priv; priv; end # priv ist private in A
def b_prot; prot; end
def b_publ; publ; end
end
b = B.new
b.b_priv #-> private
b.b_prot #-> protected
b.b_publ #-> public
Die Zugriffsrechte werden in Ruby dynamisch vergeben und können während der Laufzeit verändert werden.