Знание, является ли класс собственным классом
Какой лучший способ сказать, если класс 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