2012-08-24 18 views
11

Jak mogę sprawdzić, czy obiekt został rozszerzony przez moduł, biorąc pod uwagę obiekt i moduł?Jak ustalić, czy instancja została rozszerzona o moduł Ruby?

Wygląda na to, że nie ma żadnego odpowiedniego rozszerzenia? Metoda

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

Nigdy nie myślałem o 'include' i' include? 'O tym samym słowie ale różne znaczenia wcześniej. –

Odpowiedz

14

Czy jest jakiś powód, dla którego nie są tylko przy użyciu is_a?:

o.is_a? Foobar 
# => true 
+1

Poza tym, że nie wiedziałem, że to zadziała? ;) –

9

Można użyć

o.singleton_class.included_modules 

Albo jeśli chcesz być naprawdę treściwy:

o.singleton_class < Foobar 

Singleton klasy obiekt jest gdzie wszystkie jego pojedynczych metod żyć - rozszerzenie jest (o ile rozumiem) równoważne z włączeniem do klasy singleton. To dlatego

class Foo 
    extend Bar 
end 

i

class Foo 
    class << self 
    include Bar 
    end 
end 

Zarówno dodać metody z baru, jak metody klasy (tj Singleton metody) na Foo

Powiązane problemy