2012-08-24 7 views
11

オブジェクトとモジュールを指定すると、オブジェクトがモジュールによって拡張されたことをどのようにチェックするのですか?インスタンスがRubyモジュールによって拡張されているかどうかを判断するには?

対応する延長がないようですか?拡張がある( -

o.singleton_class < Foobar 

そのシングルトンメソッドのすべてが住んでいる場所オブジェクトのシングルトンクラスがある:メソッド

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

同じ単語を持つ「インクルード」と「インクルード」について考えたことはありません以前は異なった意味がありました。 –

答えて

14

上のクラスメソッド(つまりシングルトンメソッド)としてバーからメソッドを追加し、あなただけのis_a?を使用していない理由は何らかの理由があります:

o.is_a? Foobar 
# => true 
+1

私はそれがうまくいくかどうかわからなかったという事実以外に? ;) –

9

あなたが本当に簡潔にしたい場合は

o.singleton_class.included_modules 

を使用したりすることができます私が理解する限り)、シングルトンクラスに含めることと同等です。これはなぜ

class Foo 
    extend Bar 
end 

class Foo 
    class << self 
    include Bar 
    end 
end 

ある両Foo

関連する問題