Domanda

Ho il seguente series variabile:

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

Purtroppo, sto ottenendo un errore di compilazione con il seguente metodo, che prende un nuovo punto di dati e aggiornamenti series con un nuovo List[FlotSeries] sulla base dei nuovi dati e la vecchia 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
        }
      }
    }
  )
}

Il compilatore Scala soffoca sulla riassegnazione perché trova un tipo non corrispondente:

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

Che cosa sto facendo male qui? Sembra che dovrebbe essere restituendo una lista [FlotSeries] che può essere assegnato a series. Dal momento che il compilatore reperti Unit ho pensato a come foreach ritorna sempre Unit, io sono ma l'operatore match restituisce l'ultimo valore dell'espressione abbinato, non Unit.

È stato utile?

Soluzione

Assegnazioni in Unità di ritorno Scala (aka Scala non è nulla del tutto nullo), a differenza di Ruby, che restituisce il valore assegnato. Il tuo metodo sta tentando di tornare Unità invece di Lista [FlotSerie].

Add:

return series

per il metodo, o modificarlo per tornare Unità.

Si può anche semplificare il codice utilizzando le classi di casi e di corrispondenza corretta se è opportuno:

  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
  }

Sono abbastanza nuovo a Scala me così YMMV.

Altri suggerimenti

rimuovere series = di aver assegnato la funzione mappa per serie e non tornare nulla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top