Scala地图->;操作人员

Scala地图->;操作人员,scala,dictionary,Scala,Dictionary,符号->在Scala中的映射中是什么意思 Scala的Predef类提供了一个隐式转换,允许一个人编写 key->value作为对(key,value)的替代语法。 我在ScalabYesExample中阅读了它,但没有看到它如何适用于地图。->用于为地图耦合键和值。因此: val m = Map(1 -> "one", 2 -> "two", 3 -> "three") 将前3个正整数映射为文本等价项(即,m(1)将是“一”,等等)。你也可以把它写成 val m = Map

符号
->
在Scala中的
映射中是什么意思

Scala的
Predef
类提供了一个隐式转换,允许一个人编写
key->value
作为对
(key,value)
的替代语法。
我在ScalabYesExample中阅读了它,但没有看到它如何适用于地图。

->
用于为地图耦合键和值。因此:

val m = Map(1 -> "one", 2 -> "two", 3 -> "three")
将前3个正整数映射为文本等价项(即,
m(1)
将是
“一”
,等等)。你也可以把它写成

val m = Map((1,"one"), (2,"two"), (3,"three"))

但是第一种方法看起来更好,这就是为什么它作为一种替代方法提供。

操作符是一种在地图上下文中使用时将键与值关联的速记。在某些语言中,只允许您将键和值对(通常键在第一个位置,值在第二个位置)传递给构造函数或映射上的各种方法之一,并且会得到适当的处理——Scala映射也允许这样做

然而,Scala还提供了
key->value
的简写形式,正如您所发现的,它是通过隐式在Predef中定义的,以使关联更加清晰。从本质上讲,它是这样说的:“将左边的项目映射到右边的项目。”如果阅读map对象的定义,您会注意到它没有定义任何明显使用此
->
方法的方法。相反,这些方法采用类型为
Tuple2
(这是一个由2个值组成的元组:例如
(item1,item2)
)的对象,Scala隐式通过Predef中的方法进行转换


在某些语言中,
->
语法被定义为语言本身的一部分,但由于Scala的灵活性,这可以简单地定义为一种方法。

以下是隐式转换:

implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)
这将把任何类型转换为“ArrowAssoc”的实例

所以当Scala看到

"a"->1
它说“字符串上没有名为'->'的方法。作用域中是否有任何隐式转换可以为我提供一个名为'->'的方法的类型?”Predef.scala自动在作用域中,并提供到ArrowAssoc的转换,显然它有'->'方法。然后Scala将上述内容转换为

any2ArrowAssoc("a").->(1)

此方法返回一个Tuple2(“a”,1)(通常称为Pair)。Map有一个构造函数,它是一个Tuple2s数组(varargs),所以我们开始比赛了!编译器中没有魔法(除了被广泛用于许多不同目的的隐式转换之外),映射构造函数中也没有魔法。

正如Adam所说,
->
不是scala语法,它是类
arroassoc
的一种方法。当您编写“foo”->“bar”时,编译器将插入从“foo”到ArrowAssoc实例的隐式转换,以便可以找到
->
方法

package scala
object Predef {
   class ArrowAssoc[A](x: A) {
       def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
      }
      implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] =
        new ArrowAssoc(x)
      ...
}

谷歌“scala丰富包装”想知道更多。

是的,但你只写了我写的一个例子。但我需要知道如何解释这一点operator@Kamil-我不明白你不明白的地方。我很高兴你发现托马斯的回答很有用。第一种方法可能更好,但有两种不同的方法做同一件事确实让我困惑(显然还有其他的)。谢谢你的解释!更准确地说,key->value创建了一个元组(key,value)。Map对象的apply方法采用了(a,B)形式的可变数量的元组这是用来创建地图的。谢谢。大卫,我想它使用了Predef中的Pair类型——刚刚重读了那段代码,我应该记得。我会编辑我的答案来更正它。很多文本:)这是一个极好的解释,解释了scala如何在语言中构建原语。它似乎可以解释这一点,它不是一个映射,而是一个元组:val buildings=Array(Array(2,3,5),Array(1,8,2));val keyPoints=buildings.Map(b=>List(b(0)->b(2),b(1)->b(2));
package scala
object Predef {
   class ArrowAssoc[A](x: A) {
       def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
      }
      implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] =
        new ArrowAssoc(x)
      ...
}