我在教自己斯卡拉,我有一個哲學問題。模式是否與Scala的語言功能匹配,或者僅僅是庫功能?換一種說法,我可以,我是否足夠熟練,請寫xmatch
,這個函數除了名字之外在其他方面都與match
相同?其實,我認爲這是兩個稍有不同的問題:匹配庫功能,可能它是一個庫功能?是否匹配語言功能?
我正在考慮重新寫匹配,純粹是作爲一個練習,但我希望有一些保證是可能的。
我在教自己斯卡拉,我有一個哲學問題。模式是否與Scala的語言功能匹配,或者僅僅是庫功能?換一種說法,我可以,我是否足夠熟練,請寫xmatch
,這個函數除了名字之外在其他方面都與match
相同?其實,我認爲這是兩個稍有不同的問題:匹配庫功能,可能它是一個庫功能?是否匹配語言功能?
我正在考慮重新寫匹配,純粹是作爲一個練習,但我希望有一些保證是可能的。
模式匹配是一種語言功能,其中match
語句只是最顯着的例子。這裏有兩個其他常用的例子:
val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4))
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i)
所以,不,你不能這樣做你自己。該語言不允許您定義創建變量的新方法,因此這些事情只能在語言支持時纔會發生。
match
語句本身在語言內部使用模式匹配變量創建支持,但原則上可以將其實現爲庫特徵。然而,這將是低效的幾種情況:
// This is implemented with fast jumps, not slow if-then-else!
n match {
case 0 => // Do action 0
case 1 => // Do action 1
case 2 => // Do action 2
case _ => // Do default action
}
// This is tail recursive, so you won't overflow the stack!
def recursiveMatch(xs: List[Any]): List[Any] = xs match {
case (x @ Int) :: rest => recursiveMatch(rest)
case _ => xs
}
所以,一切的一切,不,你不能寫模式匹配自己,而你可以寫的匹配語句,也有使用的優勢已有一。
模式匹配絕對是一種語言功能。也就是說,因爲在Scala中編寫控制流結構非常簡單(並且模式匹配是健壯的),您可以輕鬆編寫自己的match
(與其他語言相比)。另一方面,
match
仍然是語言核心的一部分(我認爲),但它的行爲更像是圖書館中的某些東西。由於模式匹配有多強大,因此感覺非常有機。
這就是說,是的,你肯定可以重寫match
。
其實,match
以前是在庫中實現的,我聽說過。 Scala參考中的更改日誌表示match
成爲2.0版的保留關鍵字,此時object.match { ... }
也不再是有效的語法。
這是相當容易實現它的原理:
implicit def toMyMatch[T](obj: T) = new {
def myMatch[R](f: T => R) = f(obj)
}
我不知道確切的原因,它不再被這種方式來實現。
確切的原因?可能是因爲使用「匹配」作爲方法可以防止部分函數內部尾部調用的尾部調用優化。 – 2011-02-01 04:17:52
這個答案似乎沒有真正的答案。這是所有蓬鬆的話和讚美... – ziggystar 2011-02-01 16:34:47