与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!"
这可能在常见情况下有效,但它可能会在更复杂的情况下咬你,比如模块将自身插入到inheritance链中,或者你有其他模块提供的命名方法与你仍然希望能够调用的方法相同。 您还需要手动反转Module.included?(klass)
所做的任何事情。
不可以。你不能在Ruby 语言中包含mixin。 在某些Ruby 实现中,您可以通过在C或Java中编写特定于实现的扩展(或者在Rubinius的情况下甚至是Ruby)来实现。
试试http://github.com/yrashk/rbmodexcl ,它为您提供了一种unextend
方法。
使用Mixology C扩展(用于MRI和YARV): http : //www.somethingnimble.com/bliki/mixology
如果您已经include
-ed某些内容,则可以使用load
来重新包含该文件。 load
-ed文件中的任何定义都将覆盖现有方法。