假设我正在编写一个向第三方类添加功能的 mixin 模块。显然,我想让第三方类及其客户端可以访问一些方法和实例变量。这些构成了 mixin 模块的公共接口。
但我希望封装某些其他方法和实例变量。我不希望我正在混入的类可以访问它们,特别是我不希望它们意外覆盖、隐藏、冲突或以其他方式干扰 mixee 类的方法或实例变量——无论是那些如果第三方修改了我正在混入的类,则可能当前存在,或者将来可能创建的那些。
我需要采取哪些预防措施(如果有的话)以确保我的 mixin 以这种方式“卫生”?
创建一个单独的对象来封装您的功能和实例变量,并让 mixin 将可公开访问的方法委托给该对象。现在您只需要将单个实例变量与您的对象相关联。你甚至可以通过在模块中存储一个 {Mixee => Delegate} 哈希并在每个混合方法的开头进行查找来避免这种情况。
也许您可以创建一个子模块来包含所有实用程序方法。
module Foo
module Utils
def self.answer
42
end
end
def helpme
"the answer is #{Utils.answer}"
end
end
include Foo
puts helpme