مرشح خريطة Scala: لا يمكن تعيين الإسقاط إلى مرجع الخريطة

StackOverflow https://stackoverflow.com/questions/949255

  •  09-09-2019
  •  | 
  •  

سؤال

الرمز التالي:

var m: Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)

m = m filterKeys { s => s.length < 3 }

لا يترجم. أحصل على الخطأ التالية:

خطأ: اكتب عدم تطابق
وجدت: collection.this.map.projection [scala.this.predef.string، scala.this.int
مطلوب: collection.this.map [scala.this.predef.string، scala.this.int
m = m filterkeys {s => s.length <3}

أنا لا أفهم هذا حقا كما حسب التلال أ Projection[A,B] يمتد سمة Map[A,B+]. وبعد إنه، الإسقاط هو خريطة.

اعتقدت أنه قد يكون الأمر يتعلق بنوع متناقض B ولكن إذا كنت تستخدم Any بدلا من Int, ، لا يزال لا يترجم. ماذا ينقصني؟ الحل هو القيام به:

var m: Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)

m = Map(m filterKeys { s => s.length < 3 } toSeq : _ *) 

ولكن هذا يبدو مذهلا بالنسبة لي.

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

المحلول

حسنا - تم احتسام ذلك بمساعدة وحدة التحكم Scala:

scala> var m = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map(A -> 1, BB -> 2, CCC -> 3)

لذا فإن الاستدلال من النوع لا يستنتج نوع M على أنه خريطة ثابتة. سيقوم الكود التالي بتجميع موافق:

var m: collection.Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)
m = m filterKeys { s => s.length < 3 }

ومع ذلك، فهذه ليست مساعدة كبيرة حيث لا يمكن إضافة الخريطة بطريقة تعيد collection.Map. وبعد أعتقد أنه ينبغي أن يكون قد تجاوز ++ الطريقة الموروثة من Iterable مع Map كما نوع العودة.

هل يمكن لأي شخص التعليق على هذا؟ ما استخدام أ collection.Map?

نصائح أخرى

أنا فضولي لماذا تريد م أن تكون var بدلا من val - إذا كنت لا تحاول إعادة تعيين الخريطة لنفسها، يبدو أن الأمور تعمل على ما يرام، كما هو موضح في التشغيل، وهذا هو أكثر تمشيا مع فلسفة سكالا من تفضيل عدم قابلية التحمل عند الإمكان:

scala> val m = Map("A" -> 1, "BB" -> 2, "CCC" -> 3) 
m: scala.collection.immutable.Map[java.lang.String,Int] = Map((A,1), (BB,2), (CCC,3))

scala> val n = m filterKeys { s => s.length < 3 }
n: scala.collection.immutable.Map[java.lang.String,Int] = Map((A,1), (BB,2))

أرى أن السؤال هو نوع من القديم، من الممكن أن يكون السلوك الذي تراه مختلفا في SCALA 2.8 بالنظر إلى إعادة المرجعية الرئيسية لفئات المجموعات.

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