5

说,我有一个 classA和一个 module B。我想包含/扩展BA但将包含/扩展的方法标记为私有(因此调用者无法访问它们,A但可以在 的方法中访问它们A)。

如何包含但将所有包含的方法标记BA私有?

4

1 回答 1

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
于 2013-03-26T18:34:03.913 回答