Quelle est la différence entre Mixins et Traits?
Selon Wikipedia , Ruby Les modules sont en quelque sorte des traits similaires. Comment cela?
annonce 1. Dans les 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)
annonce 2. Il peut y avoir un 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 classe de composition C mixins MA, MB
Sont résolus implicitement.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Cela appellera foo():void
de MA
En revanche, lors de l'utilisation de Traits, la composition de la classe doit résoudre les conflits.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Ce code provoquera un conflit (deux définitions de foo():void
).
ad 3. La sémantique d'une méthode ne dépend pas qu'elle soit définie dans un trait ou dans une classe qui utilise le trait.
En d'autres termes, peu importe que la classe se compose des traits ou que le code des traits soit "copié-collé" dans la classe.
Ces pages expliquent la différence dans le langage de programmation D.
Les mixins dans ce contexte sont du code généré à la volée, puis inséré à ce point dans le code lors de la compilation. Très pratique pour les DSL simples.
Les traits sont des valeurs externes au moment de 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 traits 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 vous aidera un peu.