سؤال

لدي المتغير التالي 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 {

ماذا أفعل الخطأ هنا؟ يبدو أنه يجب أن يعود قائمة [Frotseries] التي يمكن تعيينها series. وبعد منذ اكتشاف المترجم Unit فكرت في كيف foreach إرجاع دائما Unit, أنا لكنني match إرجاع المشغل القيمة الأخيرة للتعبير المتطابق، وليس Unit.

هل كانت مفيدة؟

المحلول

المهام في وحدة إرجاع SCALA (AKA SCALA NOULL NULL NULL NULL)، على عكس Ruby التي ترجع القيمة المعينة. تتمثل طريقتك في إعادة الوحدة بدلا من القائمة [Flotserie].

يضيف:

return series

إلى طريقتك، أو تغييرها إلى وحدة العودة.

يمكنك أيضا تبسيط التعليمات البرمجية باستخدام فئات الحالة والمطابقة المناسبة إذا كان ذلك مناسبا:

  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 = أنت تعين وظيفة الخريطة إلى سلسلة وعدم إرجاع أي شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top