Ruby模块变量访问器未按预期工作

mau*_*ufl 2 ruby

所以我想要一个带变量和访问方法的模块.
我的代码看起来像这样

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
Run Code Online (Sandbox Code Playgroud)

我用撬检查了它.
结果是

  • Certificates :: Defaults具有名为address和address =的方法.
  • 如果我在get_defaults方法中调用address,它会按预期返回"something"
  • 如果我在make_root_cert中调用它,则返回nil

我在另一个模块中使用这种方式创建attr_accessor并且工作正常.我希望我只是误解了ruby的工作方式,有人可以解释为什么这个例子不起作用.也许使用ruby对象模型的实现细节.

杰里米是对的.

我的发现

这似乎与我不一致.

  • 如果使用表达式"address"并且尚未设置实例变量,则返回局部变量
  • 如果已设置实例变量,则局部变量不返回实例变量.
  • 如果两者都已设置,则返回局部变量.

另一方面,address ="test" 总是设置局部变量.

Jer*_*ten 5

在您的get_defaults方法中,address是一个局部变量.要使用setter,您必须输入以下内容:

self.address = "something"
Run Code Online (Sandbox Code Playgroud)

这将正确调用该address=方法.