2012-08-24 51 views
11

給定一個對象和一個模塊,如何檢查該對象是否已被模塊擴展?如何確定一個實例是否已被Ruby模塊擴展?

似乎沒有任何相應的擴展?方法

moirb(main):001:0> module Foobar 
irb(main):002:1> end 
=> nil 
irb(main):003:0> o=Object.new 
=> #<Object:0x000001010d1400> 
irb(main):004:0> o.class.include? Foobar 
=> false 
irb(main):005:0> o.extend Foobar 
=> #<Object:0x000001010d1400> 
irb(main):006:0> o.class.include? Foobar 
=> false 
irb(main):007:0> o.class.included_modules 
=> [PP::ObjectMixin, Kernel] 
irb(main):016:0* o.methods.grep /extend/ 
=> [:extend] 
irb(main):019:0> o.class.methods.grep /extend/ 
=> [:extend] 
+0

從來沒想過'include'和'include?'有同一個詞但之前有不同的含義。 –

回答

14

既能補充從酒吧的方法爲類方法(即單方法)是否有任何理由,你爲什麼不只是使用is_a?

o.is_a? Foobar 
# => true 
+1

除了事實我不知道那會工作? ;) –

9

您可以使用

o.singleton_class.included_modules 

或者,如果你想成爲真正的精闢:

o.singleton_class < Foobar 

的對象的單例類是所有的其單方式生活 - 延伸的(據我所知)等同於包含到單身人士課程中。這就是爲什麼

class Foo 
    extend Bar 
end 

class Foo 
    class << self 
    include Bar 
    end 
end 

Foo