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?

Foi útil?

Solução

  1. Mixins pode conter estado, (tradicionais) traços não.
  2. Mixins usar "resolução do conflito implícito", traços usar "resolução do conflito explícito"
  3. Mixins depende linearização, traços são achatadas.

Palestra sobre traços

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.

http://dlang.org/mixin.html

http://dlang.org/traits.html

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top