2012-08-24 2 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

Смежные вопросы