¿Cuál es la diferencia entre Mixins y Traits?Mixins vs. Rasgos
According to Wikipedia, los módulos de Ruby son algo así como los rasgos. ¿Cómo es eso?
¿Cuál es la diferencia entre Mixins y Traits?Mixins vs. Rasgos
According to Wikipedia, los módulos de Ruby son algo así como los rasgos. ¿Cómo es eso?
ad 1. En mixins se pueden definir variables de instancia. Los rasgos no permiten esto. El estado debe proporcionarse componiendo la clase (= clase utilizando los rasgos)
anuncio 2. Puede haber un conflicto de nombre. Dos mixins (MA
y MB
) o rasgos (TA
y TB
) definen el método con la misma definición foo():void
.
Mixin MA {
foo():void {
print 'hello'
}
}
Mixin MB {
foo():void {
print 'bye'
}
}
Trait TA {
foo():void {
print 'hello'
}
}
Trait TB {
foo():void {
print 'bye'
}
}
En mixins los conflictos en la composición de la clase C mixins MA, MB
se resuelven de manera implícita.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Para ello, será foo():void
de MA
Por otro lado durante el uso de rasgos, la composición de la clase tiene que resolver los conflictos.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Este código generará conflicto (dos definiciones de foo():void
).
ad 3. La semántica de un método no depende de si se define en un rasgo o en una clase que utiliza el rasgo.
En otras palabras, no importa si la clase consiste en los rasgos o el código de los rasgos se "copia - pega" en la clase.
Estas páginas explican la diferencia en el lenguaje de programación D.
Mixins en este contexto son el código generado sobre la marcha, y luego se inserta en ese punto de código durante la compilación. Muy útil para DSL simples.
Los rasgos son valores externos en tiempo de compilación (en lugar de códigos generados a partir de una fuente externa). La diferencia es sutil. Mixins agrega lógica, los rasgos agregan datos tales como información de tipo de tiempo de compilación.
No sé mucho sobre Ruby, pero espero que esto ayude un poco.
Mixins y Rasgos en D son completamente diferentes de lo que significan los términos en Informática en general. En D, ambas son primitivas de preprocesador para la generación automática de código. En otros idiomas, son mecanismos de herencia. La decisión de nombrar en D es desafortunada. – tylerl
+1 Me gustó mucho su respuesta. Fue conciso y describió la diferencia entre los dos muy claramente. ¡Gracias! – Tower
Si hubiera una lista de respuestas ejemplares, seguramente estaría ahí. Gracias, jk_. – Reece
Sé que es una fecha pasada, pero para futuros lectores, en ruby usaría el método del último módulo que se mezcló, por lo que llamaría a foo() forma MB –