Definice viditelnosti
Standardně, všechny metody v třídách Ruby jsou public - přístupné komukoliv. Jestli je to požadované, tento přístup může být omezen na public, private, protected objektovými metodami. Je zajímavé že toto nejsou ve skutečnosti klíčová slova, ale vlastně metody které operují na třídě, dynamicky měnící viditelnost metod.
Private
Jednoduchý příklad:
class Priklad
def metoda1
end
private # vsechny metody ktere nasleduji jsou private: nepristupne pro vnejsi objekty
def metoda2
end
end
Jestli je private metoda volána bez argumentů, to nastavuje přístup k private metodě pro všechny následující metody. Může být také volána s jmennými argumenty.
Příklad pojmenované private metody:
class Ukazka
def metoda1
end
def metoda2
end
private :metoda2
end
Zde byl private volán s argumentem, k provedení změn viditelnosti metoda2 na privátní.
Všimněte si pro třídní metody (ty které jsou deklarované pomocí def JmenoTridy.jmeno_metody), potřebujete použít další funkci: private_class_method
Běžné pouřití private_class_method je k vytvoření "nové" metody (kontruktoru).
Typický příklad implementace:(Singleton)
class Singleton
private_class_method :new
def Singleton.create(*args, &blok)
@@inst = new(*args, &blok) unless @@inst
return @@inst
end
end
Sečteno a podtrženo v C++, "privátní" míní "privátní k této třídě", zatímco v Ruby tom znamená "privátní k této instanci". Co toto znamená, v C++ z kódu v třídě A, můžete zpřístupnit nějakou privátní metodu jinému objektu typu A. V Ruby, nemůžete. Můžete výhradní přistupovat k privátním metodám pro váši instanci objektu, a ne pro jiný objekt příklad (třídy A).
V Ruby se držíme rčení:
"soukromému vlastnictví nemůžete specifikovat příjemce".
To jestli metoda je privátní, ve vašem kódu můžete říct takto:
class PristupPrivate
def a
end
private :a # a je privatni metoda
def pristup private
a # Jasne!
self.a # Jasne! stejne jako u predchoziho prikladu
jiny_objekt.a # Ani za nic, a je private, nemuzete ji takto zavolat (ale pokud by byla protected, tak muzete!)
end
end
Zde, "jiny_objekt" je "přijímač" a metoda "a" je volána. Pro private metody, to nefunguje. Ať tak nebo onak, to je to, co nám "protected" viditelnost dovolí.