我一直在閱讀一些關於Ruby的mixin方法的文章,extend
和include
,我對這種行爲還不太確定。我知道extend
會將給定模塊的實例方法作爲單例方法添加到執行擴展的模塊中,並且include
將基本上將一個模塊(方法,常量,變量)的內容附加到正在執行包含的模塊的內容上,從而有效地定義他們在接收器中。Ruby mixins:擴展幷包含
但是,經過一些修改,試圖感受行爲將如何體現,我有幾個問題。這裏是我的測試設置:
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
因此,正如我所期望的,模塊Bar
收益由於包含方法Baz
(#blorg
)定義爲,如果他們想在自己定義的實例方法和類Bacon
收益通過擴展單實例方法Bacon::blah
和Bacon::blorg
。
Bacon.blah # => blah
Bacon.blorg # => blorg
和類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
。爲什麼會發生?
+1這個問題的偉大格式。 – sargas