Синглтон-класс объекта уже создан? - PullRequest
0 голосов
/ 04 января 2011

Хотелось бы узнать, есть ли способы проверить, является ли одноэлементный класс объекта уже созданным?

Например: obj.singleton_class_defined?

1 Ответ

3 голосов
/ 04 января 2011

Одноэлементный класс объекта всегда определяется.В 1.8.7 вы можете использовать singleton_methods, чтобы увидеть, есть ли у объекта уже связанные одноэлементные методы:

>> foo = ''
=> ""
>> foo.singleton_methods
=> []

1.9.2 (возможно, также более ранние 1.9s, я не помню) также имеет методназывается singleton_class, что избавляет вас от выполнения вещи class << self; self ; end, к которой мы все привыкли:

>> foo.singleton_class #=> #<Class:#<String:0x00000100ba5648>>

Редактировать:

Поскольку вы отметили это как "объект-модель ", я также хотел бы рекомендовать следующую ссылку:

http://www.hokstad.com/ruby-object-model.html

Цитировать оттуда:

Мета-класс для всехпрактические цели актуальный класс.Это объект типа Class.Единственное, что «особенного» в метаклассе - это то, что он создается по мере необходимости и вставляется в цепочку наследования перед «реальным» классом объектов.Таким образом, внутри интерпретатора MRI объект-> класс может ссылаться на мета-класс, у которого есть указатель с именем «super», который ссылается на следующий класс в цепочке.Когда вы вызываете object.class в MRI, интерпретатор фактически «пропускает» мета-класс (и модули), если он там есть.

...