내 스칼라 유형이 일치하지 않는 이유는 무엇입니까?
문제
다음 변수가 있습니다 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
}
}
}
)
}
스칼라 컴파일러는 유형 불일치를 찾기 때문에 재 할당을 질식시킵니다.
error: type mismatch;
found : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
series = series.map(serie => serie match {
여기서 내가 뭘 잘못하고 있니? 지정할 수있는 목록 [flotseries]를 반환 해야하는 것 같습니다. series
. 컴파일러가 찾은 이후 Unit
나는 어떻게 생각했다 foreach
항상 돌아옵니다 Unit
, 나는하지만 match
연산자는 일치 한 표현식의 마지막 값을 반환합니다. Unit
.
해결책
지정된 값을 반환하는 Ruby와 달리 Scala Return Unit (일명 Scala 's Not Null Null)의 과제. 귀하의 방법은 [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 =
맵 함수를 시리즈에 할당하고 아무것도 반환하지 않습니다.
제휴하지 않습니다 StackOverflow