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

标签 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

我用 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/

相关文章:

ruby - Haskell 通过 FFI 与 Ruby 绑定(bind)?

ruby-on-rails - ruby on rails - 访问公共(public)目录时出错

ruby - 在 Ruby 中使用 Marshal::dump 进行对象序列化时如何写入文件

ruby-on-rails - 有条件地返回 ruby​​ 中的属性

ruby - 错误消息中引用了两个不同版本的 ruby​​?

javascript - Rails 中的 Angular 路由(显示空白页)

ruby - 使用 Ruby 逐行读取、编辑和写入文本文件

ruby-on-rails - 如何获取邮件模板中的主机 URL

ruby - 如何使用 Nokogiri 和 Builder 不从父元素继承 namespace ?

ruby-on-rails - rails 上的 Assets 管道