Pourquoi mes types de Scala ne correspondent pas?
Question
J'ai la series
variable suivante:
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")
}
)
Malheureusement, je reçois une erreur de compilation avec la méthode suivante, qui prend un nouveau point de données et mises à jour avec une nouvelle series
List[FlotSeries]
sur la base des nouvelles données et l'ancienne série.
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
}
}
}
)
}
Le compilateur Scala selfs sur la réaffectation parce qu'elle trouve une incompatibilité de type:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
Qu'est-ce que je fais mal ici? Il semble que ce devrait être de retour d'une liste [FlotSeries] qui peut être attribué à series
. Étant donné que le compilateur trouve Unit
je pensais que la façon dont foreach
retourne toujours Unit
, je suis, mais l'opérateur match
retourne la dernière valeur de l'expression assortie, non Unit
.
La solution
Affectations dans l'unité de retour Scala (alias Scala est pas tout à fait nul nul), contrairement à Ruby qui renvoie la valeur attribuée. Votre méthode tente de retourner l'unité au lieu de la liste [FlotSerie].
Ajouter:
return series
à votre méthode ou changer pour retourner l'unité.
Vous pouvez également simplifier votre code en utilisant des classes de cas et appariement s'il est approprié:
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
}
Je suis assez nouveau pour moi-même donc Scala YMMV.
Autres conseils
remove series =
vous assigné la fonction de carte à la série et rien retour.