Qual è la differenza tra Mixin e Tratti?Mixin vs. Tratti
According to Wikipedia, i moduli di Ruby sono tipi di tratti simili. Come mai?
Qual è la differenza tra Mixin e Tratti?Mixin vs. Tratti
According to Wikipedia, i moduli di Ruby sono tipi di tratti simili. Come mai?
annuncio 1. In mixins è possibile definire variabili di istanza. I tratti non lo consentono. Lo stato deve essere fornita da comporre classe (= classe utilizzando i tratti)
ad 2. Ci può essere il nome conflitto. Due mixin (MA
e MB
) o tratti (TA
e TB
) definiscono il metodo con la stessa definizione 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'
}
}
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();
}
}
Ciò richiederà foo():void
da MA
D'altra parte durante l'utilizzo Tratti, componendo classe ha per risolvere i conflitti.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Questo codice genererà 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 se la classe è composta dai Tratti o il codice Tratti è "copiato - incollato" nella classe.
Queste pagine spiegano la differenza nel linguaggio di programmazione D.
Mixin in questo contesto sono codice generato al volo, e quindi inseriti in quel punto nel codice durante la compilazione. Abbastanza utile per semplici DSL.
I tratti sono valori esterni in fase di compilazione (anziché codice generato da una fonte esterna). La differenza è sottile. I mixaggi aggiungono logica, i tratti aggiungono dati come informazioni sul tipo in fase di compilazione.
Non so molto di Ruby, ma spero che questo aiuti un po '.
Mixins e Tratti in D sono completamente diversi da ciò che i termini significano in Computer Science in generale. In D, entrambi sono preprocessori primitivi per la generazione automatica di codice. In altre lingue, sono meccanismi di ereditarietà. La decisione di nominare in D è sfortunata. – tylerl
+1 Mi è piaciuta molto la tua risposta. Era conciso e descriveva la differenza tra i due molto chiaramente. Grazie! – Tower
Se ci fosse una lista di risposte esemplari, questo sarebbe sicuramente su di esso. Grazie, jk_. – Reece
So che è una data di un anno, ma per i futuri lettori, in ruby userebbe il metodo dall'ultimo modulo che è stato mescolato, quindi chiamerebbe foo() modulo MB –