なぜScalaのタイプが一致していないですか?
質問
私は、次の変数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")
}
)
残念ながら、私は、新しいデータポイントを取り、更新が新しいデータに基づいて、新たなseries
と旧シリーズでList[FlotSeries]
以下の方法でコンパイルエラーを取得しています。
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
}
}
}
)
}
それは型の不一致を見つけたので、Scalaのコンパイラは、再割り当てにチョークます:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
私はここで間違って何をしているのですか?それはseries
に割り当てることができます一覧[FlotSeries]を返すべきであるように思えます。コンパイラは、私はUnit
はいつも、foreach
を返す私はしかしUnit
演算子は一致した表現ではなく、match
の最後の値を返します。
Unit
を見つけたので、 解決
Scalaのリターン単位で
割り当て(別名Scalaは非常にヌルヌルではありません)、割り当てられた値を返しますルビーとは異なり。あなたの方法は、[FlotSerie]リストの代わりにユニットを返却しようとしてます。
追加します。
return series
あなたの方法に、またはユニットを返却するように変更します。
また、それが適切かどうケースクラスと適切なマッチングを使用してコードを簡素化することができます:
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
}
私はかなり新しいためのScala自分自身そうYMMVます。
他のヒント
あなたが何かを返すシリーズへのマップ機能が割り当てられていないseries =
を削除します。
所属していません StackOverflow