2017-09-06 36 views
0

我有一個紅寶石的基本問題,我不知道爲什麼當創建一個擴展自我模塊,attr_accessor完美的作品。爲什麼attr_accessor在擴展自我的模塊中工作?

據我所知,attr_accessor應該在一個實例類中工作,但對於一些reasone它在這些模塊中工作。

下面是一個例子

module A 
    extend self 
    attr_accessor :custom_method 

    def foo 
    self.custom_method 
    end 
end 

A.custom_method # => nil 
A.foo # => nil 
A.custom_method = "bar" # => "bar" 
A.custom_method # => "bar" 
A.foo # => "bar" 

因此,將與A.custom_method發生什麼?從現在開始,它會在整個應用程序中成爲「酒吧」嗎?

我該如何銷燬A的這個「實例」?

+0

_「我有一個基本問題[...]」__ extend self'看起來無辜而且簡單,但結果可能令人難以置信。要理解正在發生的事情,可能會更容易刪除該行並擴展另一個對象,如'obj = Object.new; obj.extend(A)'。 – Stefan

+0

你知道'extend'是什麼嗎? –

回答

3

模塊有兩個上下文,「實例」上下文是指mixin方法。通過調用extend self,您可以直接在模塊上調用mixin方法。

module Example 
    def mixin_level 
    :mixed 
    end 

    def self.module_level 
    :module 
    end 
end 

默認情況下,你可以在正確的背景下只有調用這些:

Example.module_level 
# => :module 

Example.mixin_level 
# => NoMethodError: undefined method `mixin_level' for Example:Module 

如果你做的extend self招那麼mixin_level方法,並在這方面的任何其他人,也可以工作。你正在使模塊級別成爲mixin的超集。

沒有辦法破壞短缺的A去除常量。這是一個單身人士。

作爲一個說明,Rails有mattr_accesor,它簡化了創建這些而不需要extend self

+0

優秀的答案,但哪裏存儲數據集attr_accessor? –

+0

與往常一樣,無論'self'是何時執行該方法。如果這是一個mixin方法,其他某個對象調用了'include',那麼它就進入該對象。如果你在討論'A.foo',那麼它通過['instance_variables'](http://ruby-doc.org/core-2.4.1/Object)進入A對象:'A.instance_variables'。 html#method-i-instance_variables)方法可以用來反思這一點。 – tadman

+1

謝謝你的男人!你的答案真的很有幫助! ;) –

相關問題