2012-08-24 7 views
11

Wie kann ich bei einem Objekt und einem Modul überprüfen, ob das Objekt vom Modul erweitert wurde?Wie kann festgestellt werden, ob eine Instanz um ein Ruby-Modul erweitert wurde?

Es scheint keine entsprechende Erweiterung zu geben?

Methode
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

Nie über 'include' und' include? 'Mit dem gleichen Wort nachgedacht aber verschiedene Bedeutungen vorher. –

Antwort

14

hinzufügen Gibt es einen Grund, warum Sie nicht nur is_a? mit:

o.is_a? Foobar 
# => true 
+1

Abgesehen davon wusste ich nicht, dass das funktionieren würde? ;) –

9

können Sie verwenden

o.singleton_class.included_modules 

Oder wenn Sie wirklich wollen, kernig sein:

o.singleton_class < Foobar 

aN Singletonklasse Objekt ist, wo alle seine Singleton-Methoden leben - erstreckt (so weit ich es verstehe) äquivalent zur Aufnahme in die Singleton-Klasse. Aus diesem Grunde

class Foo 
    extend Bar 
end 

und

class Foo 
    class << self 
    include Bar 
    end 
end 

Sowohl die Methoden von Bar als Klassenmethoden (zB Singleton-Methoden) auf Foo