2016-02-05 266 views
0

我模塊如何從其他模塊訪問模塊的實例變量?

module SomeModule 
    @param = 'Hello' 
end 

module Reporter 
    include SomeModule 
    def self.put 
    puts @param 
    end 
end 

當我打電話Reporter::put我沒有得到任何輸出,我想這Reporter模塊有實例變量@param進不去。有沒有辦法從Reporter模塊訪問該變量?

+2

'self.put'是一個類級別的方法。你如何期望它訪問實例變量? – mudasobwa

+0

你說得對,我在想什麼? –

回答

0

實例變量被稱爲例如變量,因爲它們屬於對象(又名 「實例」)。您的示例中有兩個對象:SomeModuleReporter。兩者都有自己的實例變量。 SomeModule有一個名爲@param的實例變量,而Reporter有一個名爲@param的實例變量。這兩個實例變量是完全不相關的,即使它們具有相同的名稱。想象一下混亂,如果每個對象都必須爲實例變量提供自己的名字!

有什麼辦法從Reporter模塊訪問該變量嗎?

不可以。您不能訪問來自不同對象的實例變量。一個對象只能訪問其自己的實例變量。

[注:它是可能使用反射當然(例如Object#instance_variable_getBasicObject#instance_eval,或BasicObject#instance_exec)。許多事情都可以使用反射。]

可以做,但是,是創建一個方法,讓您訪問讀取該實例變量。這種方法被稱爲屬性讀者

module SomeModule 
    def self.param; @param end 
    @param = 'Hello' 
end 

module Reporter 
    def self.put 
    puts SomeModule.param 
    end 
end 

甚至還有自動爲您生成這些方法的方法,它被稱爲Module#attr_reader

module SomeModule 
    class << self; attr_reader :param end 
    @param = 'Hello' 
end 

module Reporter 
    def self.put 
    puts SomeModule.param 
    end 
end 

如果你想也寫實例變量,你也需要定義一個相應屬性作家方法:

module SomeModule 
    class << self 
    attr_reader :param 

    private 

    def param=(param) 
     @param = param 
    end 
    end 

    self.param = 'Hello' 
end 

module Reporter 
    def self.put 
    puts SomeModule.param 
    end 
end 

還有一個名爲Module#attr_writer的相應的方法,其生成用於您的屬性寫入方法:

module SomeModule 
    class << self 
    attr_reader :param 

    private 

    attr_writer :param 
    end 

    self.param = 'Hello' 
end 

module Reporter 
    def self.put 
    puts SomeModule.param 
    end 
end 
+0

非常感謝您提供這些信息,這對我來說非常有意義 –

1

您可以在此情況下

3

是使用類變量而不是instanse變量的

module SomeModule 
    @@param = 'Hello' 
end 

module Reporter 
include SomeModule 
def self.put 
    puts @@param 
end 
end 

Reporter.put打印123並返回nil

SomeModule.instance_variable_get(:@param) 
相關問題