2011-02-12 88 views
27

请解释“ - >”应用于scala地图的意思。斯卡拉地图 - >运营商

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

回答

35

->运算符是在地图上下文中使用时将键与值关联的简写形式。在某些语言中,您只需将一对键和值(通常是第一个键中的键和第二个键中的键)传递给构造函数或地图上的各种方法之一,然后将处理它适当 - 这也是斯卡拉地图允许的。

然而,斯卡拉还提供了key -> value,其中,因为你已经发现,在PREDEF通过隐定义的简写形式,使协会更加清晰。基本上它是这样说的:“把项目放在左边,并把它映射到右边的项目上。”您会注意到,如果您阅读了Map对象的定义,并没有定义任何明显使用此方法的方法。相反,这些方法采用Tuple2类型的对象(这是一个包含2个值的元组:例如(item1, item2)),Scala通过Predef中的方法进行隐含转换。

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

13

->用于耦合地图的键和值。所以:

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

将映射头3个的正整数成文本等同物(即,m(1)"one"等)。你也可以把它写成

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

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

+0

耶:d,但你只写我写的一个例子,但我需要知道如何解释这种操作 – Kamil 2011-02-12 21:35:40

+1

@Kamil的meening。 - 我不明白你不清楚什么,我很高兴你发现托马斯的回答很有用 – 2011-02-12 22:38:31

+0

第一种方式可能会更好,但有两种不同的方式来做同样的事情肯定会让我困惑(显然也有其他方法)。谢谢你的解释! – Programmer 2017-11-25 21:15:46

64

这里的隐式转换:

implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x) 

这将任何类型转换成 “ArrowAssoc” 的一个实例

class ArrowAssoc[A](x: A) { 
    def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y) 
} 

所以当斯卡拉看到

"a"->1 

它说:“有在String上没有名为' - >'的方法。是否有任何隐式转换可以给我一个类型一种名为' - >'?“的方法Predef.scala自动处于范围之内,并提供了对ArrowAssoc的转换,该转换明显具有' - >'方法。阶然后基本上转换以上至

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

此方法返回Tuple2( “A”,1)(通常称为对)。 Map有一个构造函数,它是Tuple2s的一个数组(可变参数),所以我们不参加比赛!编译器中没有什么魔力(除了隐式转换,它广泛地用于许多不同的目的),并且在Maps构造函数中没有魔术。

1

正如亚当所说,->不是斯卡拉语法,它是类ArrowAssoc的方法。编写“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) 
     ... 
} 

谷歌“,‘斯卡拉丰富包装’,以了解更多