我想了解斯卡拉的List
s的實現。特別是,我試圖讓我的腦袋周圍如何使用中綴運算符寫匹配表達式,例如:中綴運算符的斯卡拉匹配分解
a match {
case Nil => "An empty list"
case x :: Nil => "A list without a tail"
case x :: xs => "A list with a tail"
}
是如何匹配表達式允許是而非List(x, xs)
?
我想了解斯卡拉的List
s的實現。特別是,我試圖讓我的腦袋周圍如何使用中綴運算符寫匹配表達式,例如:中綴運算符的斯卡拉匹配分解
a match {
case Nil => "An empty list"
case x :: Nil => "A list without a tail"
case x :: xs => "A list with a tail"
}
是如何匹配表達式允許是而非List(x, xs)
?
傑伊康拉德的回答幾乎是正確的。重要的是某處有一個名爲::
的對象,它實現了unapply
方法,返回類型爲Option[(A, List[A])]
。正是如此:
object :: {
def unapply[A](ls: List[A]) = {
if (ls.empty) None
else Some((ls.head, ls.tail))
}
}
// case objects get unapply for free
case object Nil extends List[Nothing]
在::
和List
的情況下,這個對象恰好出來的事實,::
是它擴展了List
性狀的情況下類。但是,如上例所示,根本沒有爲案例類。
我認爲:: is actually a class(這是List的子類),所以說大致相當於List(x, xs)
。
您可以使用具有操作員名稱的其他案例類來執行此操作。例如:
case class %%%(x: Int, y: Int)
a match {
case x %%% y => x + y
}
如何讓匹配表達式成爲x :: xs而不是List(x,xs)?
爲了回答這個問題:
當作爲圖案,中綴 操作如p運算q相當於 到運算(P,Q)看出。也就是說,操作符op的中綴 被視爲 構造函數模式。
(Scala中編程,第1版,331頁)