Quelle est la différence entre les mixins et les traits?
Selon Wikipedia , les modules Ruby sont en quelque sorte des traits similaires. Comment?
Quelle est la différence entre les mixins et les traits?
Selon Wikipedia , les modules Ruby sont en quelque sorte des traits similaires. Comment?
Réponses:
ad 1. Dans mixins, vous pouvez définir des variables d'instance. Les traits ne permettent pas cela. L'état doit être fourni en composant la classe (= classe utilisant les traits)
ad 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
deMA
D'autre part, 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 soulèvera des conflits (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 qui utilise le trait.
En d 'autres termes, peu importe si la classe se compose des Traits ou si le code des Traits est "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és à ce stade 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 des informations de type à la compilation.
Je ne sais pas grand-chose sur Ruby, mais j'espère que cela vous aidera un peu.