2012-10-10 74 views

回答

4

(現有紅寶石2.0)如果只有下面的表達式的計算結果爲true如果對象x是eigenclass:

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

===相等性檢查斷言xClass類的實例,!=不等式檢查使用的事實是ancestors intros pection方法「跳過」特徵類。 對於作爲Object類的實例的對象x(即,x不是空白石板對象),Class === x檢查等同於x.is_a? Class或在這種特定情況下等於x.instance_of? Class

從Ruby 2.0開始,上述表達式不足以檢測本徵類,因爲它也對具有prepend ed模塊的類求值爲true。這可以通過x.ancestors.first不是這樣的前置模塊的附加檢查來解決,例如,通過Class === x.ancestors.first。另一個解決方案是如下修改整個表達式:

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

總是有蠻力:

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

我能找到'方法eigenclass'定義。它定義了什麼模塊? – sawa

+0

@sawa對不起,我已經在我的irb會話中定義了它。 –

+0

'some_class == some_class.ancestors.first'或'some_class.ancestors.first == Class'是否也適用? – sawa

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 
相關問題