Quelle est la différence entre Mixins et Traits?Mixins vs. Traits
According to Wikipedia, Ruby Les modules sont en quelque sorte des traits semblables. Comment?
Quelle est la différence entre Mixins et Traits?Mixins vs. Traits
According to Wikipedia, Ruby Les modules sont en quelque sorte des traits semblables. Comment?
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 en utilisant les caractères)
ad 2. Il peut y avoir un conflit de nom. Deux mixins (MA
et MB
) ou des traits (TA
et TB
) définissent un procédé 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'
}
}
En mixins les conflits dans la composition de la classe C mixins MA, MB
sont résolus implicitement.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Ceci appellera foo():void
de MA
D'autre part en utilisant les traits, la classe de composition 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'un procédé ne dépend pas de savoir si elle est définie dans un trait ou d'une classe qui utilise le trait. En d'autres termes, peu importe si la classe est composée du code Traits ou Traits, elle est "copiée-collée" dans la classe.
Ces pages expliquent la différence dans le langage de programmation D.
Mixins dans ce contexte sont le code généré à la volée, puis inséré à ce point dans le code lors de la compilation. Très pratique pour les simples DSL. 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 une 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 aide un peu.
Les Mixins et Traits en D sont complètement différents de ce que les termes signifient en informatique en général. En D, les deux sont des primitives de préprocesseur pour la génération automatique de code. Dans d'autres langues, ce sont des mécanismes d'héritage. La décision de nommer dans D est malheureuse. – tylerl
+1 J'ai beaucoup aimé votre réponse. Il était concis et décrit la différence entre les deux très clairement. Je vous remercie! – Tower
S'il y avait une liste de réponses exemplaires, ce serait certainement sur elle. Merci, jk_. – Reece
Je sais que c'est une date antérieure, mais pour les futurs lecteurs, dans ruby il utiliserait la méthode du dernier module qui était mélangé, donc il appellerait foo() forme MB –