斯卡拉REPL给出了两个表达式类型相同 - (元组 - ?奇怪!)。 然而, ("a" ->1)
这是一个地图,我可以添加到地图和("a", 1)
不能。 为什么斯卡拉REPL显示地图表达元组类型的类型?
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)
实际上,这样做的原因是,PREDEF: http://www.scala-lang.org/api/current/index.html#scala.Predef$ (总是在Scala中范围)包含从任何到的隐式转换ArrowAssoc(该方法implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A]
ArrowAssoc包含方法 - >将其转换成一个元组。
所以基本上你正在做any2ArrowAssoc("a").->(1)
返回( “A”,1)。
从REPL:
any2ArrowAssoc("a").->(1)
res1: (java.lang.String, Int) = (a,1)
此外,还可以在不可变的包含HashMap这样的工作:
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))
斯卡拉认为a + (b,c)
意味着你正在试图调用+
方法有两个参数,这是一种现实的可能性,因为地图也有一个多参数添加方法,所以你可以做这样的事情
m + (("a" -> 1), ("b" -> 2))
解决方法很简单:只需添加一个额外的括号所以很明显, (b,c)
其实作为一个参数传递的元组。
m + (("a", 1))