我想为一个类创建一个工厂,它将调用一个私有(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/