符号在Scala ->中的含义是什么意思Map?
Scala的Predef类提供了一种隐式转换,允许一次写入
key -> value作为该对的替代语法(key, value).我在ScalaByExample中阅读了它,但未能看到它对Maps的工作原理.
Ada*_*ung 70
这是隐式转换:
implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)
Run Code Online (Sandbox Code Playgroud)
这会将任何类型转换为"ArrowAssoc"的实例
class ArrowAssoc[A](x: A) {
def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
}
Run Code Online (Sandbox Code Playgroud)
所以,当Scala看到
"a"->1
Run Code Online (Sandbox Code Playgroud)
它说"在String上没有名为' - >'的方法.范围内是否有任何隐式转换可以为我提供一个名为' - >'的方法?" Predef.scala自动在范围内,并提供到ArrowAssoc的转换,它显然具有' - >'方法.然后Scala基本上将上面的内容转换为
any2ArrowAssoc("a").->(1)
Run Code Online (Sandbox Code Playgroud)
此方法返回Tuple2("a",1)(通常称为Pair).Map有一个构造函数,它是Tuple2s的一个数组(varargs),所以我们要参加比赛!编译器中没有魔法(除了隐式转换,它被广泛使用并用于许多不同的目的),并且在Maps构造函数中没有魔法.
Tho*_*ney 48
该->操作员是用于在地图的上下文中使用时与相关联的值的密钥的简写.在某些语言中,您只需将键和值的对(通常是第一个位置的键和第二个值中的值)传递给构造函数或地图上的各种方法之一,它将被处理适当 - Scala地图也允许这样做.
但是,Scala还提供了简写形式key -> value,正如您所发现的那样,它通过隐式在Predef中定义,以使关联更加清晰.基本上它是这样说:"把项目放在左边,然后把它映射到右边的项目." 你会注意到你是否阅读了Map对象的定义,它没有定义明显使用这种->方法的任何方法.相反,这些方法采用类型的对象Tuple2(这是2个值的元组:例如(item1, item2)),Scala隐含通过Predef中的方法转换.
在某些语言中,->语法被定义为语言本身的一部分,但由于Scala的灵活性,这可以简单地定义为方法.
Rex*_*err 14
->用于耦合地图的键和值.所以:
val m = Map(1 -> "one", 2 -> "two", 3 -> "three")
Run Code Online (Sandbox Code Playgroud)
将前3个正整数映射到文本等价物(即,m(1)将"one"等).你也可以把它写成
val m = Map((1,"one"), (2,"two"), (3,"three"))
Run Code Online (Sandbox Code Playgroud)
但第一种方式看起来更好,这就是它作为替代方案提供的原因.
| 归档时间: |
|
| 查看次数: |
21928 次 |
| 最近记录: |