[英]Understanding Scala -> syntax
通過artima“ Scala編程 ”一書,我對Scala有所了解。
在介紹Map
特征時,作者竭盡全力將->
語法描述為一種可應用於任何類型以獲取元組的方法。
確實:
scala> (2->"two")
res1: (Int, String) = (2,two)
scala> (2,"two")
res2: (Int, String) = (2,two)
scala> (2->"two") == (2, "two")
res3: Boolean = true
但是這些並不等效:
scala> Map(1->"one") + (2->"two")
res4: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> two)
scala> Map(1->"one") + (2, "two")
<console>:8: error: type mismatch;
found : Int(2)
required: (Int, ?)
Map(1->"one") + (2, "two")
為什么會這樣,因為我的第一個測試似乎表明兩個“ pair”語法都構成一個元組?
問候。
由於Predef
中的Predef
,它們完全相同(此處僅部分復制):
final class ArrowAssoc[A](val __leftOfArrow: A) extends AnyVal {
@inline def -> [B](y: B): Tuple2[A, B] = Tuple2(__leftOfArrow, y)
}
@inline implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)
因此,現在的問題是, (a,b)
語法何時不明確,而(a -> b)
a- (a -> b)
不在哪里? 答案就在函數調用中,尤其是當它們重載時:
def f[A](a: A) = a.toString
def f[A,B](a: A, b: B) = a.hashCode + b.hashCode
f(1,2) // Int = 3
f(1 -> 2) // String = (1,2)
f((1, 2)) // String = (1,2)
尤其是Map +
感到困惑,因為它已被多參數版本重載,因此您可以
Map(1 -> 2) + (3 -> 4, 4 -> 5, 5 -> 6)
因此它解釋
Map(1 -> 2) + (3, 4)
嘗試將3
和4
到地圖上。 哪一個當然沒有意義,但它不會嘗試其他解釋。
使用->
不會有這種歧義。
但是,你不能
Map(1 -> 2) + 3 -> 4
因為+
和-
具有相同的優先級。 因此,它被解釋為
(Map(1 -> 2) + 3) -> 4
再次失敗,因為您嘗試將3
代替鍵值對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.