pr1*_*001 2 types scala lift flot
我有以下变量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")
}
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我使用以下方法获得编译器错误,该方法采用新数据点并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
}
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
Scala编译器在重新分配时会因为发现类型不匹配而窒息:
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?它似乎应该返回一个可以分配给的List [FlotSeries] series.由于编译器发现Unit我想到了如何foreach总是返回Unit,我只是match操作符返回匹配表达式的最后一个值,而不是Unit.
Scala中的赋值返回Unit(又名Scala不完全为null),与返回指定值的Ruby不同.您的方法是尝试返回Unit而不是List [FlotSerie].
加:
return series
Run Code Online (Sandbox Code Playgroud)
到您的方法,或将其更改为返回单位.
如果合适,您还可以使用案例类和正确匹配来简化代码:
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
}
Run Code Online (Sandbox Code Playgroud)
我自己对Scala很新,所以YMMV.
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |