5

たとえば、 classAと module がありますB。インクルード/拡張したいが、インクルード/拡張BされAたメソッドをプライベートとしてマークします(したがって、の呼び出し元にはアクセスできませんが、Aのメソッド内ではアクセスできますA)。

含まれているすべてのメソッドを非公開としてマークBするにはどうすればよいですか?A

4

1 に答える 1

6

インクルードしてから、含まれているすべてのメソッドを明示的に非公開にしますか?

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

モンキー パッチModuleを追加private_includeしてprivate_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 に答える