Ruby 2.0如何在包含模块后从模块中取出模块?

module X end module Y end module Z #TODO include X replacement of including Y #TODO include Y replacement of including X end 

有没有办法解决ruby不包含uninclude关键字的事实?

在此处输入图像描述

如果你真的需要这种function,你可以通过使用改进来实现 。

 class Foo end module X def x puts 'x' end end module Y end module R refine Foo do include X include Y end end # In a separate file or class using R # Foo now includes X and Y Foo.new.x # In a different file or class # Foo no longer includes X and Y Foo.new.x # NoMethodError 

真正的答案是,在Ruby中,无论是1.x还是2.x,都没有办法取消包含一个模块。 但我知道有人在某处编写了Ruby扩展,允许不包含模块。

编辑:好的,实际上,OP是与Ruby的包含相反的重复吗? ,所以根据@eliah和banister的答案,有问题的库是https://github.com/yrashk/rbmodexcl和https://github.com/banister/mixology19

我对此并不满意,但如果两个模块包含相同的方法名称,它确实有效。

文件c.rb

 module A def me puts "I am C" end def whosit? puts "It's me, Becky" end end 

文件d.rb

 module A def me puts "I am D" end end 

然后

 class X load('c.rb') include A end x = X.new x.me # => I am C x.whosit? # => It's me, Becky load('d.rb') x.me # => I am D x.whosit? # => It's me, Becky !! Unwanted !! load('c.rb') x.me # => I am C 

load()只是打开模块A并更改和/或添加代码; 那里没有触及的任何东西仍然存在。 load()不是很明亮。 我认为它基本上是一个eval()并且如果它多次加载同一个文件可能会更少。

要使用它,不require c.rb或d.rb.

编辑:在之前的编辑中,我添加了一个关于require_relative的观察。 经过反思,我发现它既不重要也不有趣,所以它的头部也是如此。