たとえば、 classA
と module がありますB
。インクルード/拡張したいが、インクルード/拡張B
されA
たメソッドをプライベートとしてマークします(したがって、の呼び出し元にはアクセスできませんが、A
のメソッド内ではアクセスできますA
)。
含まれているすべてのメソッドを非公開としてマークB
するにはどうすればよいですか?A
インクルードしてから、含まれているすべてのメソッドを明示的に非公開にしますか?
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