2011-02-12 142 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) 
     ... 
} 

谷歌「,‘斯卡拉豐富包裝’,以瞭解更多