说,我有一个 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