Ruby/Metody singletonowe
Z Wikibooks, biblioteki wolnych podręczników.
[edytuj] Metody singletonowe
Zachowanie instancji zdeterminowane jest przez jej klasę, ale mogą być sytuacje, w których wiemy, że konkretna instancja powinna mieć specjalne zachowanie. W większości języków musimy niestety definiować nową klasę, która byłaby wtedy instancjonowana tylko raz. W Rubim możemy dać każdemu obiektowi jego własne metody.
class SingletonTest def rozmiar 25 end end test1 = SingletonTest.new test2 = SingletonTest.new def test2.rozmiar 10 end test1.rozmiar #=> 25 test2.rozmiar #=> 10
W tym przykładzie obiekty test1 i test2 należą do tej samej klasy, ale test2 otrzymał przedefiniowaną metodę rozmiar, więc obiekty zachowują się odmiennie. Metoda dana pojedynczemu obiektowi nazywana jest metodą singletonową. Nazwa ta może kojarzyć się z wzorcem projektowym singletonu, jednak wymaga nieco więcej wyjaśnienia. Każdy obiekt w Rubim posiada swoją klasę prototypową, która jest również obiektem i którą można modyfikować (indywidualnie dla każdego obiektu). W tym sensie każda para obiekt-klasa prototypowa jest singletonem, czyli każdy obiekt jest tylko jedną jedyną instancją swojej klasy prototypowej. Aby otworzyć definicję klasy prototypowej używamy <<. Moglibyśmy równoważnie zapisać powyższy przykład w ten sposób:
class << test2 def rozmiar 10 end end
Metody singletonowe są często używane w elementach graficznego interfejsu użytkownika (ang. GUI), gdzie, w zależności od naciśniętych przycisków muszą być podejmowane odpowiednie akcje.
Metody singletonowe nie występują jedynie w Rubim. Pojawiają się również w CLOS, Dylanie, itd. Ponadto, niektóre języki, dla przykładu Self i NewtonScript, posiadają tylko metody singletonowe. Są one czasem nazywane językami prototypowymi.