16

给定一个对象和一个模块,如何检查该对象是否已被模块扩展?

好像没有相应的扩展?方法

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]
4

2 回答 2

18

你有什么理由不只是使用is_a?

o.is_a? Foobar
# => true
于 2012-08-25T00:55:52.617 回答
12

您可以使用

o.singleton_class.included_modules

或者,如果您想变得精巧:

o.singleton_class < Foobar

一个对象的单例类是其所有单例方法所在的地方——扩展(据我所知)等同于包含到单例类中。这就是为什么

class Foo
  extend Bar
end

class Foo
  class << self
    include Bar
  end
end

两者都将 Bar 中的方法添加为类方法(即单例方法)Foo

于 2012-08-24T20:51:23.777 回答