¿Cuál es la diferencia entre Mixins y Traits?
Según Wikipedia , los módulos Ruby son algo así como rasgos similares. ¿Cómo es eso?
¿Cuál es la diferencia entre Mixins y Traits?
Según Wikipedia , los módulos Ruby son algo así como rasgos similares. ¿Cómo es eso?
Respuestas:
anuncio 1. En mixins puede definir variables de instancia. Los rasgos no permiten esto. El estado debe ser proporcionado componiendo la clase (= clase usando los rasgos)
anuncio 2.
Puede haber un conflicto de nombres. 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 clase de composición C mixins MA, MB
se resuelven implícitamente.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Esto llamará foo():void
desdeMA
Por otro lado, al usar Rasgos, la clase de composición tiene que resolver 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 está definido en un rasgo o en una clase que usa el rasgo.
En otras palabras, no importa si la clase consiste en los Rasgos o si el código de los Rasgos está "copiado-pegado" en la clase.
Estas páginas explican la diferencia en el lenguaje de programación D.
Los mixins en este contexto son códigos generados sobre la marcha y luego insertados en ese punto del 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ódigo generado desde una fuente externa). La diferencia es sutil. Los mixins agregan lógica, los rasgos agregan datos como información de tipo de tiempo de compilación.
No sé mucho sobre Ruby, pero espero que esto ayude un poco.