Qual'è la differenza tra Mixins e Traits?
Secondo Wikipedia , i moduli Ruby sono una sorta di tratti simili. Come mai?
Qual'è la differenza tra Mixins e Traits?
Secondo Wikipedia , i moduli Ruby sono una sorta di tratti simili. Come mai?
Risposte:
annuncio 1. Nei mixin è possibile definire le variabili di istanza. I tratti non lo consentono. Lo stato deve essere fornito componendo class (= class usando i tratti)
annuncio 2.
Potrebbe esserci un conflitto di nomi. 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'
}
}
Nei mixin i conflitti nella classe di composizione C mixins MA, MB
vengono risolti implicitamente.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Questo chiamerà foo():void
daMA
D'altra parte, mentre si usano i tratti, la composizione della classe deve risolvere i conflitti.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Questo codice genererà conflitti (due definizioni di foo():void
).
ad 3. La semantica di un metodo non dipende dal fatto che sia definita in un tratto o in una classe che utilizza il tratto.
In altre parole, non importa se la classe è composta da Traits o il codice Traits viene "copiato e incollato" nella classe.
Queste pagine spiegano la differenza nel linguaggio di programmazione D.
I mixin in questo contesto sono codici generati 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 (piuttosto che codice generato da una fonte esterna). La differenza è sottile. I mixin aggiungono logica, i tratti aggiungono dati come informazioni sul tipo di tempo di compilazione.
Non so molto di Ruby, ma spero che questo aiuti in qualche modo.