我有一个可以出现在我们代码库的几个不同区域中的 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
,这可能会变得丑陋。有没有更清洁的方法?或者这是我们最接近模块级“词法”范围的实例变量?