scala Map filterKeys: проекция не может быть привязана к ссылке на карту - PullRequest
0 голосов
/ 04 июня 2009

следующий код:

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} </p>

Я действительно не понимаю этого, поскольку согласно scaladoc a 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 : _ *) 

но мне это кажется не элегантным.

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Мне любопытно, почему вы хотите, чтобы m было var, а не val - если вы не пытаетесь переназначить карту на себя, кажется, что все работает нормально, как показано в ответе, и это больше соответствует философия scala - отдавать предпочтение неизменности, где это возможно:

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, учитывая основной рефакторинг классов коллекций.

0 голосов
/ 04 июня 2009

ОК - это выяснилось с помощью консоли 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...