2012-08-24 18 views
11

Dado un objeto y un módulo, ¿cómo puedo verificar que el objeto haya sido extendido por el módulo?¿Cómo determinar si una instancia ha sido extendida por un módulo de Ruby?

No parece haber ninguna extensión correspondiente? Método

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

Nunca pensó en 'include' y' include? 'Teniendo la misma palabra pero diferentes significados antes. –

Respuesta

14

¿Hay alguna razón por la cual no es justo con is_a?:

o.is_a? Foobar 
# => true 
+1

Además, ¿no sabía que eso funcionaría? ;) –

9

Puede utilizar

o.singleton_class.included_modules 

O si quieres ser muy concisa:

o.singleton_class < Foobar 

clase de singleton de un objeto es donde viven todos sus métodos simples - la ampliación es (por lo que yo entiendo) equivalente a incluir en la clase singleton. Esta es la razón por

class Foo 
    extend Bar 
end 

y

class Foo 
    class << self 
    include Bar 
    end 
end 

Ambos suman los métodos de Bar como métodos de clase (es decir, únicos métodos) en Foo

Cuestiones relacionadas