Perché i miei tipi Scala non corrisponde?
Domanda
Ho il seguente series
variabile:
var series: List[FlotSerie] = List(
new FlotSerie() {
override val label = Full("Min")
},
new FlotSerie() {
override val label = Full("Max")
},
new FlotSerie() {
override val label = Full("Avg")
}
)
Purtroppo, sto ottenendo un errore di compilazione con il seguente metodo, che prende un nuovo punto di dati e aggiornamenti series
con un nuovo List[FlotSeries]
sulla base dei nuovi dati e la vecchia serie.
def updateSeries(sample: Sample): List[FlotSerie] = {
series = series.map(serie =>
serie match {
case item if item.label == Full("Min") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.min) :: serie.data
}
}
case item if item.label == Full("Max") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.max) :: serie.data
}
}
case item if item.label == Full("Avg") => {
new FlotSerie() {
override val label = item.label
override val data = (sample.timestamp.toDouble, sample.avg) :: serie.data
}
}
}
)
}
Il compilatore Scala soffoca sulla riassegnazione perché trova un tipo non corrispondente:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
Che cosa sto facendo male qui? Sembra che dovrebbe essere restituendo una lista [FlotSeries] che può essere assegnato a series
. Dal momento che il compilatore reperti Unit
ho pensato a come foreach
ritorna sempre Unit
, io sono ma l'operatore match
restituisce l'ultimo valore dell'espressione abbinato, non Unit
.
Soluzione
Assegnazioni in Unità di ritorno Scala (aka Scala non è nulla del tutto nullo), a differenza di Ruby, che restituisce il valore assegnato. Il tuo metodo sta tentando di tornare Unità invece di Lista [FlotSerie].
Add:
return series
per il metodo, o modificarlo per tornare Unità.
Si può anche semplificare il codice utilizzando le classi di casi e di corrispondenza corretta se è opportuno:
case class FlotSerie(label:Full, data:List[Tuple2[Double, Double]])
var series: List[FlotSerie] = List( FlotSerie(Full("Min"), Nil), FlotSerie(Full("Max"), Nil), FlotSerie(Full("Avg"), Nil) )
def updateSeries(sample: Sample): List[FlotSerie] = {
series = series.map(serie => {
serie.label match {
case Full("Min") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.min) :: serie.data)
case Full("Max") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.max) :: serie.data)
case Full("Avg") => FlotSerie(serie.label, (sample.timestamp.toDouble, sample.avg) :: serie.data)
}
})
return series
}
Sono abbastanza nuovo a Scala me così YMMV.
Altri suggerimenti
rimuovere series =
di aver assegnato la funzione mappa per serie e non tornare nulla.