我有一个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
内动态定义,这可能会变得很丑陋。有更干净的方式吗?或者这是我们最接近模块级“词汇” - 范围的实例变量?