Поведение экземпляра класса определяется его методом, но бывают случаи, когда мы знаем, что определённый экземпляр должен иметь особое поведение. В большинстве языков, мы должны решить эту проблему определением другого класса, который будет инстанцирован один раз. В 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 методы. Их иногда называют языками прототипирования.