Похоже - в Scala 2.8.0 - если вы отобразите () экземпляр Map на последовательность из двух кортежей, в результате чего вы получите карту обратно. Когда это происходит, любой из 2-х кортежей с одинаковым первым элементом считается дубликатом, и в итоге вы получаете только последний. Это отличается от того, что произошло в 2.7.7. Это легче понять на примере.
Scala 2.7.7:
scala> val m = Map("a" -> 1, "b" -> 2, "c" -> 3)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2, c -> 3)
scala> m.map { case (k, v) => ("foo", v) }
res5: Iterable[(java.lang.String, Int)] = ArrayBuffer((foo,1), (foo,2), (foo,3))
Scala 2.8.0:
scala> val m = Map("a" -> 1, "b" -> 2, "c" -> 3)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,1), (b,2), (c,3))
scala> m.map { case (k, v) => ("foo", v) }
res16: scala.collection.immutable.Map[java.lang.String,Int] = Map((foo,3))
Это ожидается? Задокументировано ли изменение где-нибудь? Это кажется разумной идеей, но это стоило мне много времени, чтобы обновить приложение 2.7.7, которое опиралось на старое поведение.
Обновление:
Как указал ниже Крис Наттикомб, чтение Миграция из Scala 2.7 могло бы быть хорошим началом, прежде чем задавать этот вопрос :) В частности, упоминается использование флага компилятора -Xmigration
, который кажется чрезвычайно полезным при портировании.