2013-02-05 11 views
5

Desidero associare a livello di codice i valori inviati in mixin a un'istanza e mi chiedo se esiste un modo più immutabile per farlo con un oggetto mutabile nascosto. Principalmente voglio usare questo per un registro. Il mio attuale approccio non è rigorosamente immutabile dopo la costruzione, qualche suggerimento?Scala che registra i risultati del costruttore di mixin immutabilmente

trait Numbers { 
    lazy val values = holding 
    private var holding = Set.empty[Int] 
    protected def includes(i:Int) { 
    holding += i 
    } 
} 

trait Odd extends Numbers{ 
    includes(1) 
    includes(3) 
    includes(5) 
    includes(7) 
    includes(9) 
} 

trait Even extends Numbers { 
    includes(2) 
    includes(4) 
    includes(6) 
    includes(8) 
} 

Questo dà il risultato che voglio di

val n = new Odd with Even 
println(n.values) 

Set(5, 1, 6, 9, 2, 7, 3, 8, 4) 
+0

ho implementato questo approccio in un contenitore Scala qui http://higher-state.blogspot.co.uk/2013/03/scala-210 -simple-di-container.html –

risposta

3

Come sul metodo prioritario? È quindi possibile fare riferimento all'oggetto "super" in linearizzazione tratto,

trait Numbers { 
    def holding = Vector[Int]() 
    lazy val values = holding 
} 

trait Odd extends Numbers { 
    override def holding = super.holding ++ Vector(1,3,5) 
} 

trait Even extends Numbers { 
    override def holding = super.holding ++ Vector(0,2,4) 
} 

(new Odd with Even).values // Vector(1, 3, 5, 0, 2, 4) 
(new Even with Odd).values // Vector(0, 2, 4, 1, 3, 5) 
+0

Non avevo pensato a questo approccio. Ideale voglio stare con l'estetica degli elementi della lista per una bella sensazione di DSL. Naturalmente questo potrebbe non essere fattibile, se non si presenterà nient'altro nei prossimi giorni (sarà in vacanza), ti assegnerò la risposta –

+0

È una sfida interessante, ma temo che il compito vada contro lo spirito della composizione mixin , dove la linearizzazione cerca di selezionare un valore tra i molteplici tratti ereditati (anziché unirli). –

Problemi correlati