1

Scala REPL 为这两个表达式提供了相同的类型——(元组?——奇怪!)。然而("a" ->1),这是一张我可以添加到地图但不能添加的地图("a", 1)。为什么 Scala REPL 显示 Map 表达式的元组类型类型?

scala> :t ("a" -> 1)
(String, Int)

scala> :t ("a",1)
(String, Int)

scala> val m = Map.empty[String, Int]
m: scala.collection.immutable.Map[String,Int] = Map()

scala> m + ("a",1)
<console>:9: error: type mismatch;
 found   : String("a")
 required: (String, ?)
          m + ("a",1)
           ^

scala> m + ("a" ->1)
res19: scala.collection.immutable.Map[String,Int] = Map(a -> 1)
4

2 回答 2

3

Scala 认为a + (b,c)意味着您尝试+使用两个参数调用该方法,这是一种真正的可能性,因为地图确实具有多参数添加方法,因此您可以执行以下操作

m + (("a" -> 1), ("b" -> 2))

解决方案很简单:只需添加一组额外的括号,因此很明显(b,c)实际上是一个元组作为单个参数传递。

m + (("a", 1))
于 2013-03-24T19:42:07.277 回答
2

实际上,这样做的原因是 Predef: http://www.scala-lang.org/api/current/index.html#scala.Predef$(在 Scala 中始终在范围内)包含从 Any 到的隐式转换ArrowAssoc(方法implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A]

ArrowAssoc 包含方法 -> 将其转换为元组。

所以基本上你正在做any2ArrowAssoc("a").->(1)哪个返回(“a”,1)。

来自回复:

any2ArrowAssoc("a").->(1)
res1: (java.lang.String, Int) = (a,1)

此外,您可以像这样处理不可变的哈希图:

val x = HashMap[Int,String](1 -> "One")
x: scala.collection.immutable.HashMap[Int,String] = Map((1,One))
val y = x ++ HashMap[Int,String](2 -> "Two")
y: scala.collection.immutable.Map[Int,String] = Map((1,One), (2,Two))
val z = x + (3 -> "Three")
z: scala.collection.immutable.HashMap[Int,String] = Map((1,One), (3,Three))
于 2013-03-24T20:12:04.723 回答