在Scala中,我可以用这种方式构建Map
:
val map = Map(1 -> "one", 2 -> "two", 3 -> "three")
但是它做了什么?应该评估参数,因此1 -> "one"
具有值。它是什么?
我也注意到这个表达式返回true:
scala> 1 -> "one" == (1, "one")
res1: Boolean = true
那有什么区别?
答案 0 :(得分:6)
它来自班级ArrowAssoc
(http://www.scala-lang.org/api/current/scala/Predef$$ArrowAssoc.html)。查看包含所有预导入方法的对象Predef
(http://www.scala-lang.org/api/current/scala/Predef$.html)。在那里你应该找到方法any2ArrowAssoc[A](x: A): ArrowAssoc[A]
,这是隐式转换,允许在任何东西上调用方法->
。
要详细说明这个答案,这意味着您的示例中隐含了以下代码:
scala> 'a' -> 1 == (any2ArrowAssoc('a').->(1))
res0: Boolean = true
答案 1 :(得分:1)
简而言之,它只是Pair
(或Tuple2
)类型的扩展方法。如果你看一下scala中的Map
类型,你会看到它由2对的arint或元组组成。据我所知,它是专门为Map
构造定义的,用于表示{{1}关联key value
,但您可以轻松编写等同于key -> value
的{{1}},只是看起来更好。所以Map(("a", 1), ("b", 2))
等于因为它是相同的。在scala中,Map("a" -> 1, "b"-> 2)
is defined作为Predef对象中的隐式类
答案 2 :(得分:1)
来自书" Scala编程" (http://booksites.artima.com/programming_in_scala_2ed):
Scala编译器将1 -> "Go to island."
之类的二进制运算表达式转换为(1).->("Go to island.")
。
因此,当您说1 -> "Go to island."
时,您实际上是在值为->
的整数上调用名为1
的方法,并传入值为"Go to island."
的字符串
这个->
方法可以在Scala程序中的任何对象上调用,它返回一个包含键和值的双元素元组。
Scala机制,允许您在任何对象上调用->
,隐式转换。