2016-06-16 33 views
1

如果我在斯卡拉下面這段代碼:案例在地圖VS沒有Case

val prices = Map("bread" -> 4.56, "eggs" -> 2.98, "butter" -> 4.35) 
prices.map((k,v) => (k, v-1.1)).toMap 

我得到的錯誤:

The expected type requires a one-argument function accepting a 2-Tuple. 
Consider a pattern matching anonymous function, `{ case (k, v) => ... }` 

但是,當我改變第二行:

prices.map{ case(k,v) => (k, v - 1.1) }.toMap 

上述錯誤消失?有人可以解釋什麼時候我需要在地圖功能中使用大小寫?

回答

1

正如@ chrisaycock的評論中所提到的,常規地圖中沒有自動解鎖。你需要這樣使用它:

scala> val prices = Map("bread" -> 4.56, "eggs" -> 2.98, "butter" -> 4.35) 
prices: scala.collection.immutable.Map[String,Double] = Map(bread -> 4.56, eggs -> 2.98, butter -> 4.35) 

scala> prices.map(kv => (kv._1, kv._2-1.1)).toMap 
res0: scala.collection.immutable.Map[String,Double] = Map(bread -> 3.4599999999999995, eggs -> 1.88, butter -> 3.2499999999999996) 
+0

哦,永遠不會到我的頭......謝謝你指出了!同樣在map函數中,如果我使用case,它只是我必須使用{}的語法。我不能這樣做:'price.map(case(k,v)=>(k,v - 1.1)).toMap'我知道像'()'用於參數,'{}'用於功能體。那麼'case'關鍵字是一個函數嗎? – LP45

+0

我不認爲'case'會被認爲是一個函數。我知道'l.map(/ * do stuff * /)'相當於'l.map {/ * do stuff * /}' –

+0

抱歉,對於遲到的回覆。哦,當你沒有情況下,它們是可以互換的? – LP45