2010-01-18 56 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文件中的任何定義都將覆蓋現有的方法。