質問

私は、次の変数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 =を削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top