Traços Mixins vs.
-
06-09-2019 - |
Pergunta
O que é a diferença entre Mixins e traços?
Segundo a Wikipedia , Ruby módulos são uma espécie de como traços. Como assim?
Solução
- Mixins pode conter estado, (tradicionais) traços não.
- Mixins usar "resolução do conflito implícito", traços usar "resolução do conflito explícito"
- Mixins depende linearização, traços são achatadas.
ad 1. Em mixins você pode definir variáveis ??de instância. Traços não permitem isso. O estado deve ser fornecido por compor classe (= classe usando os traços)
ad 2.
Não pode ser o nome conflito. Dois mixins (MA
e MB
) ou traços (TA
e TB
) definem método com o mesmo foo():void
definição.
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 em compor C mixins MA, MB
classe são resolvidos de forma implícita.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Isto irá chamar foo():void
de MA
Por outro lado, enquanto usando traços, compondo classe tem de resolver conflitos.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Este código irá elevar conflito (duas definições de foo():void
).
ad 3. Será que a semântica de um método não depende de saber se ele é definido em um traço ou em uma classe que usa o traço.
Em outras palavras, não importa wheter a classe consiste nos traços ou o código Traços é "copiar - colado". Para a classe
Outras dicas
Estas páginas explicar a diferença na linguagem de programação D.
Mixins neste contexto são o código gerado na mosca, e depois inserido naquele ponto no código durante a compilação. Bastante útil para DSLs simples.
Traços são valores externos de tempo de compilação (em vez de código gerada a partir de uma fonte externa). A diferença é sutil. Mixins adicionar lógica, Traços adicionar dados como informações de tipo de tempo de compilação.
Não sei muito sobre Ruby, mas espero que isso ajude um pouco.