为什么我的Scala类型不匹配?

为什么我的Scala类型不匹配?,scala,types,flot,lift,Scala,Types,Flot,Lift,我有以下变量系列: 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") } ) 不幸的是,我在使用以下方法时遇到

我有以下变量
系列

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")
  }
)
不幸的是,我在使用以下方法时遇到了一个编译器错误,它获取了一个新的数据点,并根据新的数据和旧的序列更新了一个新的
列表[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 {

我做错了什么?它似乎应该返回一个可以分配给
系列的列表[FlotSeries]。由于编译器查找
Unit
我想到了
foreach
如何总是返回
Unit
,我只是
match
操作符返回匹配表达式的最后一个值,不
Unit

删除
series=
您被分配了映射函数到series,并且不返回任何内容。

在Scala返回单元中赋值(也称Scala不完全为null),这与Ruby返回赋值不同。您的方法正在尝试返回Unit而不是List[FlotSerie]

加:

方法,或将其更改为返回单位

如果合适,还可以使用case类和适当的匹配来简化代码:

  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非常陌生,所以我很喜欢它。

谢谢,Alex,类型错误并没有让我明白问题不在于我的映射,而在于方法的返回值。感谢您提醒我,任务返回单位。我希望它返回指定的值!我曾经希望它返回指定的值,但后来我完全停止使用var并从功能上编程,我更高兴了:)原因可能与避免=vs==bug有关,并且可能会对语言的其他部分施加一些语法限制。
  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
  }