Qual é a diferença entre Mixins e Traits?
Segundo a Wikipedia , os Módulos Ruby são uma espécie de características. Como assim?
Qual é a diferença entre Mixins e Traits?
Segundo a Wikipedia , os Módulos Ruby são uma espécie de características. Como assim?
Respostas:
anúncio 1. Nos mixins, você pode definir variáveis de instância. Traços não permitem isso. O estado deve ser fornecido pela composição da classe (= classe usando os traços)
anúncio 2.
Pode haver um conflito de nome. Dois mixins ( MA
e MB
) ou traços ( TA
e TB
) definem método com a mesma definição 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'
}
}
Em mixins, os conflitos na classe de composição C mixins MA, MB
são resolvidos implicitamente.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Isso ligará foo():void
deMA
Por outro lado, ao usar Traits, a composição da classe precisa resolver conflitos.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Este código irá gerar conflito (duas definições de foo():void
).
ad 3. A semântica de um método não depende de ser definida em uma característica ou em uma classe que a usa.
Em outras palavras, não importa se a classe consiste nos traços ou se o código de traços é "copiado e colado" na classe.
Estas páginas explicam a diferença na linguagem de programação D.
Os mixins nesse contexto são códigos gerados em tempo real e, em seguida, inseridos nesse ponto no código durante a compilação. Bastante útil para DSLs simples.
Traços são valores externos em tempo de compilação (em vez de código gerado a partir de uma fonte externa). A diferença é sutil. Os mixins adicionam lógica, os traços adicionam dados como informações do tipo em tempo de compilação.
Não sei muito sobre Ruby, mas espero que isso ajude um pouco.