我一直在糾結這個問題,這很煩人(Scala 2.13.4)。
case class Coord(x: Int, y: Int)
val data: List[(Int, Int)] = List( (1,2), (3,4) )
data.map{ (x,y) =>
Coord(x,y)
}
給我這個錯誤:
found : (Int, Int) => Coord
required: ((Int, Int)) => Coord
我可以通過添加“case”關鍵字來解決
data.map{ case (x,y) =>
Coord(x,y)
}
我的問題是何時必須使用“case”關鍵字(在此特定情況下和一般情況下)。編譯器應該已經知道它會得到一個 Int 元組。似乎大部分時間都不需要它。元組是否有特殊規則,因為它們也使用括號?
uj5u.com熱心網友回復:
data.map{ case (x,y) =>
Coord(x,y)
}
相當于
data.map { tuple =>
tuple match {
case (x, y) => Coord(x,y)
}
}
它稱為模式匹配匿名函式。
uj5u.com熱心網友回復:
case在函式文字中使用從來不是強制性的。
{ (x, y) => ??? }
定義一個有兩個引數的函式,類似于你從代碼中得到的
object Foo extends Function2[A, B, C] {
def apply[A, B, C](x: A, y: B): C = ???
}
傳遞元組時,元組作為單個引數傳遞,然后需要在函式內部對其進行解構。以下是解構元組的所有等效方法
{ tuple =>
val (x, y) = tuple
???
}
{ tuple =>
tuple match {
case (x, y) => ???
}
}
{ case (x, y) => ??? }
請注意,如果您有一個包含 1 個以上引數的函式值,則該值具有tupled將包含n 個引數的函式轉換為包含n個組件的單個元組的函式的方法。
val f = { (x: Int, y: Int) => Coord(x, y) }
// alternatively:
// val f: (Int, Int) => Coord = Coord.apply
val coordinatePairs = List( (1, 2), (3, 4) )
// alternatively:
// val coordinatePairs = List(1 -> 2, 3 -> 4)
coordinatePairs.map(f.tupled)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377875.html
標籤:斯卡拉
上一篇:如何從scala中的地圖更改鍵
