2013-12-15 42 views
1

在Scala中我可以建立一個Map這樣:是' - >'是一個運算符嗎?它返回什麼?

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

但是它有什麼作用?參數應該被評估,所以1 -> "one"有一個值。那是什麼?

我也注意到這個表達式返回true:

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

所以,有什麼區別呢?

+3

有**沒有操作員** Scala中,一切都是方法(只是一個奇怪的名字)。 – Eastsun

+0

Eastsun>我認爲查看對象作爲運算符的單線程方法是非常有益的,特別是當它們通常被稱爲中綴運算符時。 – Felix

+0

當我在這裏說對象時,我當然是指類的實例(對於混淆,在Scala中有太多該死的關鍵字:P) – Felix

回答

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

簡而言之,它只是Pair(或Tuple2)類型的擴展方法。如果你看看Map類型的scala,你會發現它包含了2或2的元組對。我知道它是專門爲Map構造定義的,表示key value關聯key -> value,但是你可以很容易地寫出Map(("a", 1), ("b", 2))哪個相當於Map("a" -> 1, "b"-> 2),只是看起來更好。所以1 -> "one" == (1, "one")是相等的,因爲它是相同的。在階,->is defined如PREDEF對象

+1

'這只是Pair的擴展方法'我想你的意思是任何類型T上的擴展方法,返回Pair [T,...]'。 – senia

+0

是的,你應該編輯答案;正如@senia所說的,它是_not_和'Pair' /'Tuple2'上的擴展方法;那就是該方法的結果。它通過'any2ArrowAssoc'在_any_類型上定義。 –

1

http://booksites.artima.com/programming_in_scala_2ed)的隱式類從書 「Scala中編程」:

Scala編譯器變換像1 -> "Go to island."(1).->("Go to island.")二進制運算表達式。

因此,當你說1 -> "Go to island.",你實際上是調用與價值1整數命名爲->方法,傳入一個字符串值"Go to island."

->方法,它可以在任何對象上調用在Scala程序中,返回包含鍵和值的兩元素元組。

斯卡拉機制,允許你調用->任何對象,隱式轉換。