为什么斯卡拉REPL显示地图表达元组类型?(Why Scala REPL shows tuple t

2019-10-17 21:21发布

斯卡拉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)

Answer 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))


Answer 2:

斯卡拉认为a + (b,c)意味着你正在试图调用+方法有两个参数,这是一种现实的可能性,因为地图有一个多参数添加方法,所以你可以做这样的事情

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

解决方法很简单:只需添加一个额外的括号所以很明显, (b,c)其实作为一个参数传递的元组。

m + (("a", 1))


文章来源: Why Scala REPL shows tuple type for Map expression?