在Scala中我可以建立一個Map
這樣:是' - >'是一個運算符嗎?它返回什麼?
val map = Map(1 -> "one", 2 -> "two", 3 -> "three")
但是它有什麼作用?參數應該被評估,所以1 -> "one"
有一個值。那是什麼?
我也注意到這個表達式返回true:
scala> 1 -> "one" == (1, "one")
res1: Boolean = true
所以,有什麼區別呢?
在Scala中我可以建立一個Map
這樣:是' - >'是一個運算符嗎?它返回什麼?
val map = Map(1 -> "one", 2 -> "two", 3 -> "three")
但是它有什麼作用?參數應該被評估,所以1 -> "one"
有一個值。那是什麼?
我也注意到這個表達式返回true:
scala> 1 -> "one" == (1, "one")
res1: Boolean = true
所以,有什麼區別呢?
它來自類ArrowAssoc
(http://www.scala-lang.org/api/current/scala/Predef$$ArrowAssoc.html)。查看包含所有預導入方法的對象Predef
(http://www.scala-lang.org/api/current/scala/Predef$.html)。在那裏您應該找到方法any2ArrowAssoc[A](x: A): ArrowAssoc[A]
,這是隱式轉換,允許在任何情況下調用方法->
。
爲了詳細說明這個答案,這意味着下面的代碼是在你的例子暗示:
scala> 'a' -> 1 == (any2ArrowAssoc('a').->(1))
res0: Boolean = true
簡而言之,它只是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對象
'這只是Pair的擴展方法'我想你的意思是任何類型T上的擴展方法,返回Pair [T,...]'。 – senia
是的,你應該編輯答案;正如@senia所說的,它是_not_和'Pair' /'Tuple2'上的擴展方法;那就是該方法的結果。它通過'any2ArrowAssoc'在_any_類型上定義。 –
(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程序中,返回包含鍵和值的兩元素元組。
斯卡拉機制,允許你調用->
任何對象,隱式轉換。
有**沒有操作員** Scala中,一切都是方法(只是一個奇怪的名字)。 – Eastsun
Eastsun>我認爲查看對象作爲運算符的單線程方法是非常有益的,特別是當它們通常被稱爲中綴運算符時。 – Felix
當我在這裏說對象時,我當然是指類的實例(對於混淆,在Scala中有太多該死的關鍵字:P) – Felix