some_class
クラスがオブジェクトの固有クラスであるかどうかを判断する最良の方法は何ですか?
3 に答える
4
(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以降では、上記の式は、edモジュールtrue
を持つクラスに対しても評価されるため、固有クラスを検出するには不十分です。これは、そのような付加されたモジュールprepend
ではない追加のチェックによって解決できます。別の解決策は、式全体を次のように変更することです。x.ancestors.first
Class === 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 に答える