3

some_classクラスがオブジェクトの固有クラスであるかどうかを判断する最良の方法は何ですか?

4

3 に答える 3

4

(Ruby 2.0より前)次の式は、オブジェクトが固有クラスであるtrue場合にのみ評価されます。x

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

等式チェックは、それがクラスのインスタンスである===と主張します。不等式チェックは、イントロスペクションメソッドが固有クラスを「スキップ」するという事実を使用します。クラスのインスタンスであるオブジェクト(つまり、空白のスレートオブジェクトではない)の場合、チェックはと同等であるか、この特定の場合は。と同等です。xClass!=ancestorsxObjectxClass === xx.is_a? Classx.instance_of? Class

Ruby 2.0以降では、上記の式は、edモジュールtrueを持つクラスに対しても評価されるため、固有クラスを検出するには不十分です。これは、そのような付加されたモジュールprependではない追加のチェックによって解決できます。別の解決策は、式全体を次のように変更することです。x.ancestors.firstClass === x.ancestors.first

Class === x && !x.ancestors.include?(x)
于 2012-10-14T07:10:31.413 に答える
3

常にブルートフォースがあります:

ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}
于 2012-10-10T14:03:57.910 に答える
2

少なくとも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
于 2014-02-01T21:12:41.030 に答える