web-dev-qa-db-fra.com

Mixins vs. Traits

Quelle est la différence entre Mixins et Traits?

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

144
KaptajnKold
  1. Les mixins peuvent contenir des traits d'état, (traditionnels) non.
  2. Les mixins utilisent la "résolution implicite des conflits", les traits utilisent la "résolution explicite des conflits"
  3. Les mixines dépendent de la linéarisation, les traits sont aplatis.

Conférence sur les traits

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.

207
jk_

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 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.

8
Aiden Bell