是' - >'一个运营商?它返回了什么?

时间:2013-12-15 06:47:52

标签: scala

在Scala中,我可以用这种方式构建Map

val map = Map(1 -> "one", 2 -> "two", 3 -> "three")

但是它做了什么?应该评估参数,因此1 -> "one"具有值。它是什么?

我也注意到这个表达式返回true:

scala> 1 -> "one" == (1, "one")
res1: Boolean = true

那有什么区别?

3 个答案:

答案 0 :(得分:6)

它来自班级ArrowAssochttp://www.scala-lang.org/api/current/scala/Predef$$ArrowAssoc.html)。查看包含所有预导入方法的对象Predefhttp://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机制,允许您在任何对象上调用->,隐式转换。