2012-08-24 6 views
11

Dato un oggetto e un modulo, come posso controllare che l'oggetto sia stato esteso dal modulo?Come determinare se un'istanza è stata estesa da un modulo Ruby?

Non sembra esserci un'estensione corrispondente? Metodo

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

Mai pensato a "include" e "include?" Con la stessa parola ma diversi significati prima. –

risposta

14

C'è qualche motivo per cui non sono solo utilizzando is_a?:

o.is_a? Foobar 
# => true 
+1

Oltre al fatto che non sapevo che avrebbe funzionato? ;) –

9

È possibile utilizzare

o.singleton_class.included_modules 

Oppure, se si vuole essere davvero lapidaria:

o.singleton_class < Foobar 

classe singleton di un oggetto è dove tutti i suoi metodi Singleton vivono - che si estende è (per quanto ho capito) equivale a includere nella classe Singleton. Questo è il motivo per cui

class Foo 
    extend Bar 
end 

e

class Foo 
    class << self 
    include Bar 
    end 
end 

Entrambi aggiungere i metodi da Bar come metodi di classe (cioè Singleton metodi) su Foo

Problemi correlati