防止与特定于模块的实例变量发生冲突

时间:2013-02-28 04:53:44

标签: ruby

我有一个mixin可以出现在我们代码库的几个不同区域。在某些情况下,存在或者是一个边缘情况,模块使用实例变量与类使用的实例变量冲突。

预先设置变量名称@__like_this是一个解决方案,但我们提出的另一个更复杂,具有这种通用结构,其中访问器方法是闭包:

module HiddenValue
  def initialize
    hidden_value = nil
    define_singleton_method :value, ->() { hidden_value }
    define_singleton_method :value=, ->(v) { hidden_value = v }
    super
  end
end

class RealClass
  include HiddenValue
  # [...]
end

foo = RealClass.new
foo.value = 123
foo.value # => 123

这是不好的风格?这意味着所有想要直接访问变量的方法必须在initialize内动态定义,这可能会变得很丑陋。有更干净的方式吗?或者这是我们最接近模块级“词汇” - 范围的实例变量?

0 个答案:

没有答案