Pergunta

Eu tenho o seguinte series variável:

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")
  }
)

Infelizmente, eu estou recebendo um erro de compilação com o seguinte método, que leva um novo ponto de dados e atualizações series com um novo List[FlotSeries] com base nos novos dados e da antiga série.

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
        }
      }
    }
  )
}

As bobinas compilador Scala sobre a reatribuição, porque ele encontra uma incompatibilidade de tipo:

error: type mismatch;
found   : Unit
required: List[net.liftweb.widgets.flot.FlotSerie]
   series = series.map(serie => serie match {

O que estou fazendo de errado aqui? Parece que ele deve estar retornando uma lista [FlotSeries] que pode ser atribuído a series. Uma vez que os achados do compilador Unit Pensei em como foreach sempre retorna Unit, eu sou, mas o operador match retorna o último valor da expressão correspondente, não Unit.

Foi útil?

Solução

Atribuições em Scala Unidade de retorno (aka nulo não completamente nulo de Scala), ao contrário de Ruby que retorna o valor atribuído. Seu método é a tentativa de retorno da unidade em vez de Lista [FlotSerie].

Adicionar:

return series

para o seu método, ou alterá-lo para retornar Unidade.

Você também pode simplificar o seu código usando as classes de caso e correspondência adequada se for apropriado:

  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
  }

Eu sou muito novo para Scala me tão YMMV.

Outras dicas

Remover series = você está atribuída a função de mapa de série e não retornando nada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top