Ruby 工厂方法调用私有(private) setter

标签 ruby

我想为一个类创建一个工厂,它将调用一个私有(private) setter 。这可能吗?

这样做:

class Foo
  def self.from_bar(bar)
    f = new bar.foo_id # bar has the id of the foo object I want to make
    f.bar = bar        # but I also wanna store the bar object in foo
    f
  end

  def initialize(id)
  end

  private
  attr_writer :bar

  # lazily load and memoize bar if needed and construction was not
  # made from factory method
  def bar
    @bar ||= ...
  end
end

导致 NoMethodError: private method 错误。我可以发送该方法,但我正在寻找一种非hacky的方法来做到这一点。

编辑:将 attr_accessor 更改为 attr_writer 并添加内存阅读器以在这里揭示更多我的意图。

最佳答案

这只有通过一种 hacky 方法才能实现:

class Foo
  def self.from_bar(bar)
    new(bar.foo_id).tap { |f| f.send(:bar=, bar) }
    # or, better:
    new(bar.foo_id).tap { |f| f.instance_variable_set(:@bar, bar) }
  end

  private
  attr_accessor :bar
end

老实说,将 attr_accessor 设为私有(private)还是有一定意义的。

关于Ruby 工厂方法调用私有(private) setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49111390/

相关文章:

ruby-on-rails - 不可逆迁移 - 警告并确认而不是中止?

ruby - 无法激活 aws-sdk-v1-1.67.0,因为 json-2.1.0 与 json (~> 1.4) 冲突 (Gem::ConflictError)

ruby - Watir - 点击元素与手动不同

ruby - .tmLanguage 放在 sublime text 3 的什么地方?

ruby-on-rails - Ruby 中的互斥锁不适用于 Redis?

ruby - 停留在 EdgeCase Ruby Koans 上的 about_methods.rb

ruby-on-rails - Rails 控制台找不到 Rake,但 Bundler 安装了它

ruby-on-rails - Rails 3 上的 OpenSSL::SSL::SSLError

ruby-on-rails - Gem::Ext::BuildError: 错误:无法为 rails 版本 4.2.6 构建 gem native 扩展

c# - 从 C# 调用 ruby​​ 脚本