module SomeModule
@param = 'Hello'
end
module Reporter
include SomeModule
def self.put
puts @param
end
end
當我打電話Reporter::put
我沒有得到任何輸出,我想這Reporter
模塊有實例變量@param
進不去。有沒有辦法從Reporter
模塊訪問該變量?
module SomeModule
@param = 'Hello'
end
module Reporter
include SomeModule
def self.put
puts @param
end
end
當我打電話Reporter::put
我沒有得到任何輸出,我想這Reporter
模塊有實例變量@param
進不去。有沒有辦法從Reporter
模塊訪問該變量?
實例變量被稱爲例如變量,因爲它們屬於對象(又名 「實例」)。您的示例中有兩個對象:SomeModule
和Reporter
。兩者都有自己的實例變量。 SomeModule
有一個名爲@param
的實例變量,而Reporter
有一個名爲@param
的實例變量。這兩個實例變量是完全不相關的,即使它們具有相同的名稱。想象一下混亂,如果每個對象都必須爲實例變量提供自己的名字!
有什麼辦法從
Reporter
模塊訪問該變量嗎?
不可以。您不能訪問來自不同對象的實例變量。一個對象只能訪問其自己的實例變量。
[注:它是可能使用反射當然(例如Object#instance_variable_get
,BasicObject#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
非常感謝您提供這些信息,這對我來說非常有意義 –
您可以在此情況下
是使用類變量而不是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)
'self.put'是一個類級別的方法。你如何期望它訪問實例變量? – mudasobwa
你說得對,我在想什麼? –