Warum passen meine Scala Typen nicht?
Frage
Ich habe die folgende Variable series
:
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")
}
)
Leider erhalte ich einen Compiler-Fehler mit dem folgenden Verfahren, die einen neuen Datenpunkt nimmt und Updates series
mit einem neuen List[FlotSeries]
auf der Grundlage der neuen Daten und der alten 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
}
}
}
)
}
Die Scala-Compiler Drosseln auf der Neuzuordnung, weil es einen Typenkonflikt findet:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
Was mache ich hier falsch? Es scheint, wie sollte es eine Liste [FlotSeries] zurückkehren, die series
zugeordnet werden können. Da der Compiler Unit
finde ich dachte daran, wie foreach
immer Unit
zurückkehrt, ich bin aber der match
Operator gibt den letzten Wert des Ausdrucks abgestimmt, nicht Unit
.
Lösung
Zuordnungen in Scala Rückkehr Unit (aka Scala ist nicht ganz null null), im Gegensatz zu Rubin, das gibt den zugewiesenen Wert. Ihre Methode versucht Einheit zurückzukehren statt List [FlotSerie].
Anzahl:
return series
auf Ihre Methode, oder ändern Einheit zurückzukehren.
Sie können auch Ihren Code anhand von Fallklassen und eine richtige Anpassung vereinfachen, wenn es angebracht ist:
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
}
Ich bin ziemlich neu in Scala ich so YMMV.
Andere Tipps
entfernen series =
sind Sie die Karte Funktion Serie zugeordnet und nichts zurück.