与Ruby相反的是什么?

时间:2010-01-18 18:22:11

标签: ruby reflection

如果我有一个包含多个包含模块的类实例,我可以动态取消包含特定模块(为了替换它)吗?

感谢。

6 个答案:

答案 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)

真正的答案是改进

请检查这个答案。

https://stackoverflow.com/a/19462745/1409600