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