所以我想要一个带有变量和访问方法的模块。
我的代码看起来像这样
module Certificates
module Defaults
class << self
attr_accessor :address
def get_defaults
address = "something"
make_root_cert
end
def make_root_cert
blub = address
# do somthing
end
end
end
我用 pry 子检查了它。
结果是
- Certificates::Defaults 具有名为address 和address= 的方法。
- 如果我在 get_defaults 方法中调用地址,它会按预期返回“某物”
- 如果我在 make_root_cert 中调用它,它会返回 nil
我在另一个模块中使用了这种 attr_accessor 创建方式,效果很好。我希望我只是误解了 ruby 的工作方式,有人可以解释为什么这个例子不起作用。也许使用 ruby 对象模型的实现细节。
杰里米是对的。
我的发现
这对我来说似乎不一致。
- 如果您使用表达式“address”并且尚未设置实例变量,它将返回局部变量
- 如果实例变量已设置且局部变量未设置,则返回实例变量。
- 如果两者都已设置,则返回局部变量。
另一方面,address="test"总是设置局部变量。
最佳答案
在您的 get_defaults
方法中,address
是一个局部变量。要使用 setter ,您必须输入以下内容:
self.address = "something"
这将正确调用 address=
方法。
关于Ruby 模块变量访问器未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962369/