ruby - 如何反转 ruby​​ 的包含函数

标签 ruby class metaprogramming

我将在代码中解释我正在寻找的内容,因为这可能是最简洁的:

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/

相关文章:

python - 无需通过 __setattr__ 创建类属性

ruby - 重新初始化 ruby​​ 类

macros - 将宏变量传递给函数进行插值

ruby-on-rails - 将对象转换为散列然后将其保存到用户的列

javascript - 如何使用 AJAX 将数据从 ruby​​ Controller 发送到应用程序 javascript?

ruby - 如何在 ruby​​ 中替换数组中的单个元素?

c# - 这些声明之间有什么区别1类objClass;和2类objClass = null

c++ - 为什么要在类中创建函数指针结构?

继承类中的ruby method_alias

c - 为什么 `& 0xff` 在 Ruby 源代码中会这样执行?