2009-11-05 35 views
2

我有以下變量series爲什麼我的Scala類型不匹配?

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的List [FlotSeries]。由於編譯器發現Unit我想到的是如何foreach總是返回Unit,我可是match運算符返回匹配的表現,而不是Unit的最後一個值。

回答

6

分配在斯卡拉返還單元(又名斯卡拉不是很空空),不像紅寶石返回指定的值。你的方法試圖返回Unit而不是List [FlotSerie]。

地址:

return series 

到你的方法,或者將其更改爲返回單位。

你也可以使用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 
    } 

我是很新,斯卡拉自己這麼因人而異。

+0

謝謝,亞歷克斯,錯誤類型不使其清楚,我認爲這個問題是不是與我的映射,但該方法的返回值。謝謝你提醒我一個任務返回Unit。我希望它返回分配的值! – pr1001 2009-11-05 18:20:19

+1

我已經在那裏我希望它返回分配的值,但後來我完全停止使用VAR和功能編程案件,我更快樂:)原因很可能與避免做= VS ==錯誤,並有可能會在語言的其他部分放置一些語法限制。 – 2009-11-06 06:38:00

1

刪除series =您已將地圖功能分配給系列而不返回任何東西。