我有模块
module SomeModule
@param = 'Hello'
end
module Reporter
include SomeModule
def self.put
puts @param
end
end
当我调用Reporter::put
时,我没有输出,我认为Reporter
模块无法访问实例变量@param
。有没有办法从Reporter
模块访问该变量?
答案 0 :(得分:3)
是
box-shadow: inset 3px -5px 81px 97px rgba(0,0,0,0.89);
答案 1 :(得分:1)
您可以使用类变量而不是instanse变量
module SomeModule
@@param = 'Hello'
end
module Reporter
include SomeModule
def self.put
puts @@param
end
end
Reporter.put
打印123
并在这种情况下返回nil
答案 2 :(得分:0)
实例变量称为实例变量,因为它们属于对象(又名“实例”)。您的示例中有两个对象: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
如果您还要写入实例变量,还需要定义相应的属性writer 方法:
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