Вопрос

У меня есть следующая переменная 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
        }
      }
    }
  )
}

Компилятор Scala прерывает переназначение, потому что обнаруживает несоответствие типов:

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.

Это было полезно?

Решение

Присваивания в Scala возвращают единицу измерения (она же Scala, не совсем null null), в отличие от Ruby, который возвращает присвоенное значение.Ваш метод пытается вернуть единицу измерения вместо списка [FlotSerie].

Добавить:

return series

к вашему методу или измените его на возвращаемую единицу измерения.

Вы также могли бы упростить свой код, используя классы case и правильное сопоставление, если это уместно:

  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 = вам назначена функция map для series, и вы ничего не возвращаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top