如果我有一个包含多个包含模块的类实例,我可以动态取消包含特定模块(为了替换它)吗?
感谢。
答案 0 :(得分:6)
它不是真的同样的东西,但你可以用这样的东西伪造它:
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)
所做的任何事情。
答案 1 :(得分:5)
没有。你不能在Ruby 语言中取消包含mixin。在一些Ruby 实现上,您可以通过在C或Java中编写特定于实现的扩展(或者在Rubinius的情况下甚至是Ruby)来实现。
答案 2 :(得分:4)
试试http://github.com/yrashk/rbmodexcl,为您提供unextend
方法。
答案 3 :(得分:2)
使用Mixology C扩展(用于MRI和YARV):http://www.somethingnimble.com/bliki/mixology
答案 4 :(得分:1)
如果您已经include
编辑了某些内容,则可以使用load
重新包含该文件。 load
- ed文件中的任何定义都将覆盖现有方法。
答案 5 :(得分:0)