Mixins vs. Traits

Quelle est la différence entre Mixins et Traits?

Selon Wikipedia , les modules Ruby sont en quelque sorte des traits similaires. Comment?

    1. Les mixins peuvent contenir des caractéristiques, les traits (traditionnels) ne le sont pas.
    2. Les mixins utilisent la “résolution implicite des conflits”, les traits utilisent la “résolution explicite des conflits”
    3. Les mixins dépendent de la linéarisation, les traits sont aplatis.

    Conférence sur les traits

    ad 1. Dans mixins, vous pouvez définir des variables d’instance. Les traits ne le permettent pas. L’état doit être fourni en composant la classe (= classe utilisant les traits)

    ad 2. Il peut y avoir le conflit de nom. Deux mixins ( MA et MB ) ou traits ( TA et TB ) définissent la méthode avec la même définition 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' } } 

    Dans les mixins, les conflits dans la composition des C mixins MA, MB classe C mixins MA, MB sont résolus implicitement.

     Class C mixins MA, MB { bar():void { foo(); } } 

    Cela va appeler foo():void de MA

    Par contre, lors de l’utilisation de Traits, la classe de composition doit résoudre les conflits.

     Class C mixins TA, TB { bar():void { foo(); } } 

    Ce code déclenchera un conflit (deux définitions de foo():void ).

    ad 3. La sémantique d’une méthode ne dépend pas du fait qu’elle soit définie dans un trait ou dans une classe utilisant le trait.

    En d’autres termes, peu importe que la classe soit composée des Traits ou que le code Traits soit “copié-collé” dans la classe.

    Ces pages expliquent la différence dans le langage de programmation D.

    http://dlang.org/mixin.html

    http://dlang.org/traits.html

    Les mixins dans ce contexte sont des codes générés à la volée, puis insérés à ce moment dans le code lors de la compilation. Très pratique pour les DSL simples.

    Les caractères sont des valeurs externes à la compilation (plutôt que du code généré à partir d’une source externe). La différence est subtile. Les mixins ajoutent de la logique, les caractéristiques ajoutent des données telles que les informations de type à la compilation.

    Je ne sais pas grand chose sur Ruby, mais j’espère que cela aide quelque peu.