2010-11-18 57 views

回答

10

Object#extend已將公開,否則您將無法使用它。畢竟,它的目的是將一個模塊混合到一個對象中,所以你通常將它稱爲obj.extend(Foo),這對於私有方法來說是不可能的。

Module#include通常只使用的模塊體的內部,像這樣:

class Bar 
    include Foo 
end 

即它通常被稱爲沒有接收器,所以它不必公開。當然,也不是也是私有的。

我的猜測是,爲什麼它是私有的是,它是更具侵入性的原因,因爲它改變了Bar實例的行爲,而Object#extend只改變一個對象。因此,Module#include在某種意義上是「更危險的」,因此是私人的。

我不知道這是否是實際原因,但它與其他類似方法如Module#define_method一致。

+0

它不*有*。如果它是私有的,你可以使用它:'obj.send(:extend,Foo)','obj.instance_eval {extend Foo}',不包括模塊class Bar的情況;延伸Foo;結束' – 2012-06-02 20:39:17

+0

@ Marc-AndréLafortune:或者'class << obj;延伸Foo;當然了。就像我說的,這只是一個猜測。 – 2012-06-02 22:26:26

+0

我回復你的第一句話:「Object#extend'必須是公開的,否則你將無法使用它。」 – 2012-06-02 23:43:02

1

爲了能夠在任何時候運行Foo.include(Bar)很可能是非常討厭的錯誤的來源。

1

爲了補充約爾格W¯¯米塔格的回答,對象#擴展也可用於包括模塊的實例方法的類等級中使用(這也將提供給該類的所有實例):

module Foo 
    def bar (baz) 
    end 
end 

class Qux 
    extend Foo 

    bar 'asdf' 
end 
相關問題