Поведение объекта класса определяется его принадлежностью к конкретному классу, но бывают случаи, когда некоторый объект должен иметь особое поведение. В большинстве языков мы должны в этом случае определить новый класс, который будет инстанциирован лишь один раз. В Ruby мы можем назначить любому объекту его собственные методы.
ruby> class SingletonTest
| def size
| print "25\n"
| end
| end
nil
ruby> test1 = SingletonTest.new
#<SingletonTest:0xbc468>
ruby> test2 = SingletonTest.new
#<SingletonTest:0xbae20>
ruby> def test2.size
| print "10\n"
| end
nil
ruby> test1.size
25
nil
ruby> test2.size
10
nil
В этом примере, test1 и test2 принадлежат одному и тому же классу, но для test2 переопределен метод size, так что он ведет себя по-другому. Метод, определенный только для единичного объекта, называется singleton-методом.
Singleton-методы часто используются для элементов (GUI), где при нажатии различных кнопок должны производиться различные действия.
Singleton-методы не являются характерными только для Ruby, они также присутствуют и в CLOS, Dylan, и т.д. Также в некоторых языках, например Self и NewtonScript, существуют только singleton-методы. Их иногда называют prototype-based языки.
Источник: www.opennet.ru
К началу статьи