说,我有一个班级A
和一个模块B
。我希望将B
包含/扩展到A
,但将包含/扩展方法标记为私有(因此A
的调用者无法访问它们,但可以在A
)。
如何将B
加入A
,但将所有包含的方法标记为私有?
答案 0 :(得分: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