【发布时间】:2010-01-18 18:22:10
【问题描述】:
如果我有一个包含多个包含模块的类实例,我可以动态取消包含特定模块(以替换它)吗?
谢谢。
【问题讨论】:
标签: ruby reflection
如果我有一个包含多个包含模块的类实例,我可以动态取消包含特定模块(以替换它)吗?
谢谢。
【问题讨论】:
标签: ruby reflection
没有。您不能在 Ruby 语言 中取消包含 mixin。不过,在某些 Ruby 实现上,您可以通过用 C 或 Java(甚至是 Rubinius 的情况下的 Ruby)编写特定于实现的扩展来做到这一点。
【讨论】:
这真的不是一回事,但你可以用这样的东西来伪造它:
module A
def hello
puts "hi!"
end
end
class B
include A
end
class C
include A
end
B.new.hello # prints "Hi!"
class Module
def uninclude(mod)
mod.instance_methods.each do |method|
undef_method(method)
end
end
end
class B
uninclude A
end
B.new.hello rescue puts "Undefined!" # prints "Undefined!"
C.new.hello # prints "Hi!"
这可能适用于常见情况,但它可能会在更复杂的情况下给您带来麻烦,例如模块将自身插入继承链的位置,或者您有其他模块提供命名相同的方法,您仍然希望能够打电话。您还需要手动反转 Module.included?(klass) 所做的任何事情。
【讨论】:
试试http://github.com/yrashk/rbmodexcl,它为你提供了unextend方法。
【讨论】:
使用 Mixology C 扩展(用于 MRI 和 YARV):http://www.somethingnimble.com/bliki/mixology
【讨论】:
如果你已经 include-ed 了一些东西,你可以使用 load 重新包含文件。 load-ed 文件中的任何定义都将覆盖现有方法。
【讨论】:
【讨论】: