我将在代码中解释我正在寻找的内容,因为这可能是最简洁的:
module Mixin
def method
puts "Foo"
end
end
class Whatever
include Mixin
end
w = Whatever.new
w.method
=> "Foo"
# some magic here
w2 = Whatever.new
w.method
=> NoMethodError
我曾尝试使用 remove_const 取消定义 Mixin 模块,但这似乎对 Whatever 没有任何影响。我曾假设 #include 只是将对模块的引用添加到类的方法解析链中 - 但这种行为与此不符。
谁能告诉我 include 在幕后实际做了什么,以及如何扭转它?
最佳答案
您可能希望在实例而不是整个类上完成这些操作,因此我将稍微更改 klochner 的代码以仅处理一个实例而不是类的所有实例。
module ModuleRemover
def remove_module(mod, options = {})
metaclass = class << self; self end
mod.instance_methods.each {|method_name| metaclass.class_eval { undef_method(method_name.to_sym) }}
end
end
正如 Mladen 指出的那样,避免删除在宿主类上被覆盖的方法会很酷,因此此方法的 [only, exclude]
选项将是理想的选择。
>> c1 = C.new
>> c1.foo
=> fooing
>> c1.extend(ModuleRemover)
>> c1.remove_module(Mod)
>> c1.foo
=> NoMethodError: undefined method `foo' for #< C:0x11b0d90>
>> c2 = C.new
>> c2.foo
=> fooing
关于ruby - 如何反转 ruby 的包含函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2403057/