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 に答える