Question

J'ai la series variable suivante:

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

Malheureusement, je reçois une erreur de compilation avec la méthode suivante, qui prend un nouveau point de données et mises à jour avec une nouvelle series List[FlotSeries] sur la base des nouvelles données et l'ancienne 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
        }
      }
    }
  )
}

Le compilateur Scala selfs sur la réaffectation parce qu'elle trouve une incompatibilité de type:

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

Qu'est-ce que je fais mal ici? Il semble que ce devrait être de retour d'une liste [FlotSeries] qui peut être attribué à series. Étant donné que le compilateur trouve Unit je pensais que la façon dont foreach retourne toujours Unit, je suis, mais l'opérateur match retourne la dernière valeur de l'expression assortie, non Unit.

Était-ce utile?

La solution

Affectations dans l'unité de retour Scala (alias Scala est pas tout à fait nul nul), contrairement à Ruby qui renvoie la valeur attribuée. Votre méthode tente de retourner l'unité au lieu de la liste [FlotSerie].

Ajouter:

return series

à votre méthode ou changer pour retourner l'unité.

Vous pouvez également simplifier votre code en utilisant des classes de cas et appariement s'il est approprié:

  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
  }

Je suis assez nouveau pour moi-même donc Scala YMMV.

Autres conseils

remove series = vous assigné la fonction de carte à la série et rien retour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top