2010-01-18 66 views

回答

5

不可以。您不能在Ruby 语言中取消混入mixin。在一些红宝石实现上,你可以通过在C或Java(甚至Rubinius的情况下甚至是Ruby)编写实现特定的扩展来实现。

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

如果您已经include -ed的东西,你可以用load重新包含的文件。 load -ed文件中的任何定义都将覆盖现有的方法。