2

我有以下变量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 {

我在这里做错了什么?似乎它应该返回一个可以分配给的 List[FlotSeries] series。由于编译器发现Unit我想到了foreach总是返回Unit,我是但match运算符返回匹配表达式的最后一个值,而不是Unit

4

2 回答 2

6

Scala 中的赋值返回 Unit(也就是 Scala 的不完全为 null),与返回赋值的 Ruby 不同。您的方法试图返回 Unit 而不是 List[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。

于 2009-11-05T04:22:09.477 回答
1

删除series =您已将地图功能分配给系列并且不返回任何内容。

于 2009-11-05T02:33:27.433 回答