假設我想確定Admin
是否繼承自ActiveRecord::Base
。一種方法是做到這一點是Admin.new.kind_of? ActiveRecord::Base
,但是實例化一個未使用的Admin
對象。如何確定類A是否從類B繼承而未實例化Ruby中的A對象?
有沒有簡單的方法做到這一點,而不創建一個Admin
對象?
感謝
假設我想確定Admin
是否繼承自ActiveRecord::Base
。一種方法是做到這一點是Admin.new.kind_of? ActiveRecord::Base
,但是實例化一個未使用的Admin
對象。如何確定類A是否從類B繼承而未實例化Ruby中的A對象?
有沒有簡單的方法做到這一點,而不創建一個Admin
對象?
感謝
當然,只是比較了兩個類:
if Admin < ActiveRecord::Base
# ...
end
這是值得注意的是,雖然Module#<
將從AR::Base
返回true
如果Admin
繼承,它將返回false
或nil
如果這不是案子。 false
意味着它是另一回事,而nil
是用於無關的類(例如String < Range
返回nil
)。
Admin.ancestors.includes? ActiveRecord::Base
對於直接祖先,你也可以使用
Admin.superclass == ActiveRecord::Base
這會起作用,但效率不高,因爲它會生成一個所有祖先的數組,然後遍歷它尋找'ActiveRecord :: Base'。 – 2011-03-06 19:02:22
啊,只是讀了源代碼,它創建了一個效率稍低的新紅寶石數組。雖然它具有稍微易於閱讀的好處(找出「這段代碼做了什麼?」)。 – 2011-03-06 19:06:37
這很簡單:
Admin < ActiveRecord::Base
=> true
我喜歡這個,因爲class'Class'是從'Module'派生的。 http://www.ruby-doc.org/core-1.8.7/classes/Module.html#M000206 – DigitalRoss 2011-03-06 19:13:13
Admin.ancestors.include? ActiveRecord::Base
嗯。那麼,這是有效的,但我們剛剛學到了一個更好的方法。看起來Ruby's Module class定義了operator <
for this purpose,並且由於class Class來自Module,,這意味着<
將直接測試派生類。
+1這很漂亮。 – 2011-03-06 18:58:33
Ups,太晚了:-) – 2011-03-06 19:00:25
如果你正在尋找文檔,碰巧類class是從Module派生的,所以:http://www.ruby-doc.org/core-1.8.7/class /Module.html#M000206 – DigitalRoss 2011-03-06 19:15:19