如何确定Ruby模块是否已扩展实例?

All*_*ate 12 ruby module extend

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

似乎没有任何相应的延伸?方法

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]
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 16

您有没有理由不仅仅使用is_a?:

o.is_a? Foobar
# => true
Run Code Online (Sandbox Code Playgroud)

  • 除了我不知道那行得通的事实之外?;) (2认同)

Fre*_*ung 9

您可以使用

o.singleton_class.included_modules
Run Code Online (Sandbox Code Playgroud)

或者如果你想要真正精辟:

o.singleton_class < Foobar
Run Code Online (Sandbox Code Playgroud)

对象的单例类是其所有单例方法所在的位置 - 扩展是(据我所知)等效于包含到单例类中.这就是为什么

class Foo
  extend Bar
end
Run Code Online (Sandbox Code Playgroud)

class Foo
  class << self
    include Bar
  end
end
Run Code Online (Sandbox Code Playgroud)

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