Mixins Tratti vs.
-
06-09-2019 - |
Domanda
Qual è la differenza tra mixin e Tratti?
Secondo Wikipedia , Ruby moduli sono un po 'come tratti. In che modo?
Soluzione
- mixin può contenere Stato, (tradizionali) tratti non lo fanno.
- mixin usare "risoluzione dei conflitti implicito", tratti usano "risoluzione dei conflitti esplicito"
- Mixin dipende linearizzazione, i tratti sono appiattite.
ad 1. In mixins è possibile definire variabili di istanza. Tratti non consentono questo. Lo stato deve essere fornita da comporre classe (= classe utilizzando i tratti)
annuncio 2.
Ci può essere il conflitto di nomi. Due mixins (MA
e MB
) o tratti (TA
e TB
) definiscono metodo con lo stesso foo():void
definizione.
Mixin MA {
foo():void {
print 'hello'
}
}
Mixin MB {
foo():void {
print 'bye'
}
}
Trait TA {
foo():void {
print 'hello'
}
}
Trait TB {
foo():void {
print 'bye'
}
}
In mixins i conflitti in composizione di classe C mixins MA, MB
sono risolti in modo implicito.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Questa chiamerà foo():void
da MA
D'altra parte durante l'utilizzo di tratti, la composizione di classe ha per risolvere i conflitti.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Questo codice solleverà conflitto (due definizioni di foo():void
).
annuncio 3. La semantica di un metodo non dipende dal fatto che è definito in un tratto o in una classe che utilizza il tratto.
In altre parole, non importa wheter la classe è costituito dai tratti o il codice Tratti è "copia - incollato". Nella classe
Altri suggerimenti
Queste pagine spiegano la differenza nel linguaggio di programmazione D.
mixin in questo contesto sono codice generato al volo, e poi inserito in quel punto nel codice durante la compilazione. Molto utile per semplici DSL.
Tratti sono valori esterni di compilazione (anziché codice generato da una sorgente esterna). La differenza è sottile. Mixins aggiungere la logica, Tratti di aggiungere metadati quali le informazioni di tipo in fase di compilazione.
Non so molto di Ruby, ma speriamo che questo aiuta un po '.