Знание, является ли класс собственным классом

Какой лучший способ сказать, если класс some_class является собственным классом некоторого объекта?

3 ответа

Решение

(До Ruby 2.0) Следующее выражение оценивает true если только если объект x это собственный класс:

Class === x && x.ancestors.first != x

=== проверка на равенство утверждает, что x является примером Class класс, != Проверка неравенства использует тот факт, что ancestors Метод самоанализа "пропускает" собственные классы. Для объектов x которые являются примерами Object класс (то есть x не объект чистого листа), Class === x проверка эквивалентна x.is_a? Class или, в данном конкретном случае, чтобы x.instance_of? Class,

Начиная с Ruby 2.0, вышеприведенного выражения недостаточно для обнаружения собственных классов, поскольку оно оценивается как true также для классов, которые имеют prependмодули ed. Это может быть решено дополнительной проверкой того, что x.ancestors.first не такой предварительно подготовленный модуль, например, Class === x.ancestors.first, Другое решение заключается в изменении всего выражения следующим образом:

Class === x && !x.ancestors.include?(x)

Там всегда грубая сила

ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}

В 2.1.0 как минимум есть Module.singleton_class?:

Module.singleton_class?
#=> false
Module.new.singleton_class?
#=> false
Class.singleton_class?
#=> false
Class.new.singleton_class?
#=> false
Class.singleton_class
#=> #<Class:Class>
Class.singleton_class.singleton_class?
#=> true
Другие вопросы по тегам