2010-01-18 16 views

Respuesta

5

No. No puede deshacerse de una mezcla en Ruby Idioma. En algunas implementaciones de Ruby puedes hacerlo escribiendo una extensión específica de implementación en C o Java (o incluso Ruby en el caso de Rubinius).

6

No es realmente lo mismo, pero se puede fingir con algo como esto:

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!" 

Esto puede funcionar en el caso común, pero que puede morder en casos más complicados, como cuando el módulo se inserta en la cadena de herencia, o tiene otros módulos que proporcionan métodos denominados de la misma manera que aún desea poder llamar. También necesitaría invertir manualmente todo lo que hace Module.included?(klass).

1

Si ya tiene algo include -ed, puede utilizar load para volver a incluir el archivo. Cualquier definición en el archivo load -ed sobrescribirá los métodos existentes.

Cuestiones relacionadas