实例变量称为实例变量,因为它们属于对象(又名“实例”)。您的示例中有两个对象: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