Подтвердить что ты не робот

Как определить, был ли экземпляр расширен модулем 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]
4b9b3361

Ответ 1

Есть ли причина, по которой вы не просто используете is_a?:

o.is_a? Foobar
# => true

Ответ 2

Вы можете использовать

o.singleton_class.included_modules

Или, если вы хотите быть действительно содержательным:

o.singleton_class < Foobar

Объект singleton class - это то, где все его одиночные методы живут - расширение (насколько я понимаю) эквивалентно включению в одноэлементный класс. Вот почему

class Foo
  extend Bar
end

и

class Foo
  class << self
    include Bar
  end
end

Оба добавляют методы из класса Bar как методы класса (например, методы singleton) на Foo