Pregunta

Tengo el siguiente series variables:

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

Por desgracia, estoy consiguiendo un error del compilador con el método siguiente, que toma un nuevo punto de datos y actualizaciones series con un nuevo List[FlotSeries] en base a los nuevos datos y la vieja serie.

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

El compilador Scala se ahoga con la reasignación porque encuentra una coincidencia de tipos:

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

¿Qué estoy haciendo mal aquí? Parece que hay que devolviendo una lista [FlotSeries] que se puede asignar a series. Desde el compilador encuentra Unit pensé en cómo foreach siempre devuelve Unit, no soy más que el operador match devuelve el último valor de la expresión coincidente, no Unit.

¿Fue útil?

Solución

Las asignaciones en la Unidad de retorno Scala (también conocido como Scala no es nulo absolutamente nula), a diferencia de Ruby que devuelve el valor asignado. Su método está intentando devolver la unidad en lugar de la lista [FlotSerie].

Añadir:

return series

a su método, o cambiarlo para devolver la unidad.

También puede simplificar el código usando las clases de casos y una correcta adecuación si es apropiado:

  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
  }

Soy bastante nuevo para mí mismo así Scala tu caso es distinto.

Otros consejos

eliminar series = que ha asignado la función de mapa de series y no devolver nada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top