我可以包含/扩展模块,但将所有包含/扩展方法标记为私有吗?

时间:2013-03-26 18:15:17

标签: ruby module

说,我有一个班级A和一个模块B。我希望将B包含/扩展到A,但将包含/扩展方法标记为私有(因此A的调用者无法访问它们,但可以在A)。

如何将B加入A,但将所有包含的方法标记为私有?

1 个答案:

答案 0 :(得分:6)

包括然后明确地将所有包含的方法设为私有?

class A
  include B
  private *B.instance_methods
  extend B
  class << self
    private *B.instance_methods
  end
end

你可以通过追加Module来补充private_includeprivate_extend

class Module
  def private_include *modules
    class_eval do
      self.send(:include, *modules)
      modules.each do |mod|
        self.send(:private, *mod.instance_methods)
      end
    end
  end

  def private_extend *modules
    singleton = class << self; self end
    singleton.instance_eval do
      self.send(:include, *modules)
      modules.each do |mod|
        self.send(:private, *mod.instance_methods)
      end
    end
  end
end