- 修訂後 -
嗯,我不知道我看到的差異,斯卡拉2.9.1.RC3,
val f: PartialFunction[Int, Int] = { case 2 => 3 }
f.isDefinedAt(1) // evaluates to false
f.isDefinedAt(2) // evaluates to true
f(1) // match error
val g: PartialFunction[Int, Int] = x => x match { case 2 => 3 }
g.isDefinedAt(1) // evaluates to false
g.isDefinedAt(2) // evaluates to true
g(1) // match error
看來f
和g
行爲都一模一樣與PartialFunctions
相同。
這裏是另一個例子展示了等價:更有意思的
Seq(1, "a").collect(x => x match { case s: String => s }) // evaluates to Seq(a)
:
// this compiles
val g: PartialFunction[Int, Int] = (x: Int) => {x match { case 2 => 3 }}
// this fails; found Function[Int, Int], required PartialFunction[Int, Int]
val g: PartialFunction[Int, Int] = (x: Int) => {(); x match { case 2 => 3 }}
所以這是在編譯器級別的一些特殊套管x => x match {...}
,只是{...}
之間的轉換。
更新。在閱讀語言規範後,這對我來說似乎是一個錯誤。我在錯誤跟蹤器中提交了SI-4940。
事實上,你的第一個變種是無效的。 item沒有定義(應該是,它並不意味着列表中的一個元素)。過濾器期望一個函數,你必須編寫list.filter {item => item match ...這不僅僅是匹配消失。 –
@didierd,我編輯了這個問題來解決你的問題,因爲我認爲這裏仍然有一個有趣的問題。 –
@kipton感謝您的更新。 –