extend
Ruby の mixin メソッド、およびに関する記事をいくつか読んでいますがinclude
、その動作についてはまだよくわかりません。extend
特定のモジュールのインスタンス メソッドをシングルトン メソッドとして拡張を行うモジュールにinclude
追加し、モジュールの内容 (メソッド、定数、変数) をインクルードを行うモジュールに本質的に追加し、それらを効果的に定義することを理解しています受信機。
しかし、動作がどのように現れるかを感じようと試行錯誤した後、いくつか質問があります。これが私のテスト設定です:
module Baz
def blorg
puts 'blorg'
end
end
module Bar
include Baz
def blah
puts 'blah'
end
end
module Foo
extend Bar
end
class Bacon
extend Bar
end
class Egg
include Bar
end
予想通り、moduleは( )Bar
で定義されたインスタンス メソッドを包含メソッドによってそれ自体で定義されているかのように取得し、class はシングルトン メソッドと拡張によって取得します。Baz
#blorg
Bacon
Bacon::blah
Bacon::blorg
Bacon.blah # => blah
Bacon.blorg # => blorg
また、クラスは( and now )Egg
で定義されたメソッドをインスタンス メソッドとして取得します。Bar
#blah
#blorg
Egg.new.blah # => blah
Egg.new.blorg # => blorg
私はそれをすべて理解していますので、それは良いことです。
#ancestors
ただし、および#is_a?
メソッドを使用して得られる応答がわかりません。
Bacon.ancestors # => [Bacon, Object, Kernel, BasicObject]
Bacon.is_a? Bar # => true
Egg.ancestors # => [Egg, Bar, Baz, Object, Kernel, BasicObject]
Egg.is_a? Bar # => false
モジュールを拡張すると、そのモジュールについて照会されたときに#is_a?
メソッドが返されるように見えtrue
ますが、それはクラスの祖先に追加されず、包含に関してはその逆です: クラスの祖先には含まれるモジュールが含まれていますが、#is_a?
メソッドはfalse
照会されると戻ります。なぜこれが起こるのですか?