5

假设我正在编写一个向第三方类添加功能的 mixin 模块。显然,我想让第三方类及其客户端可以访问一些方法和实例变量。这些构成了 mixin 模块的公共接口。

但我希望封装某些其他方法和实例变量。我不希望我正在混入的类可以访问它们,特别是我不希望它们意外覆盖、隐藏、冲突或以其他方式干扰 mixee 类的方法或实例变量——无论是那些如果第三方修改了我正在混入的类,则可能当前存在,或者将来可能创建的那些。

我需要采取哪些预防措施(如果有的话)以确保我的 mixin 以这种方式“卫生”?

4

2 回答 2

2

创建一个单独的对象来封装您的功能和实例变量,并让 mixin 将可公开访问的方法委托给该对象。现在您只需要将单个实例变量与您的对象相关联。你甚至可以通过在模块中存储一个 {Mixee => Delegate} 哈希并在每个混合方法的开头进行查找来避免这种情况。

于 2009-07-31T11:16:56.340 回答
1

也许您可以创建一个子模块来包含所有实用程序方法。

module Foo
  module Utils
    def self.answer
      42
    end
  end
  def helpme
    "the answer is #{Utils.answer}"
  end
end
include Foo
puts helpme
于 2009-07-31T11:19:32.890 回答