Si tengo una instancia de clase, que contiene varios módulos incluidos, ¿puedo anular la inclusión dinámica de un módulo específico (para reemplazarlo)?¿Qué es lo opuesto a la inclusión de Ruby?
Gracias.
Si tengo una instancia de clase, que contiene varios módulos incluidos, ¿puedo anular la inclusión dinámica de un módulo específico (para reemplazarlo)?¿Qué es lo opuesto a la inclusión de Ruby?
Gracias.
Pruebe http://github.com/yrashk/rbmodexcl, que proporciona un método unextend
para usted.
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).
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)
.
Utilice la extensión de ciencia de la mezcla C (por resonancia magnética y YARV): http://www.somethingnimble.com/bliki/mixology
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.
la respuesta verdadera es el refinamiento
favor marque esta respuesta.
Ahora en https://github.com/banister/mixology19 –