Set
不是case class
並沒有一個unapply
方法。
這兩件事意味着你不能直接在Set
上模式匹配。
(更新:除非你定義自己的提取爲Set
,如丹尼爾正確地顯示在他的回答)
你應該找到一個替代方案,我建議使用摺疊功能
def union(s: Set[Int], t: Set[Int]): Set[Int] =
(s foldLeft t) {case (t: Set[Int], x: Int) => t + x}
這將積累s
元素超過t
,逐一添加它們
摺疊
下面是docs爲摺疊操作中,如果需要的話以供參考:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
適用的二進制運算符的開始值,並且該組中的所有元素,從左到右。
注意:除非訂購了基礎集合類型,否則可能會針對不同的運行返回不同的結果。或者操作員是關聯和交換的。
B the result type of the binary operator.
z the start value.
op the binary operator.
returns the result of inserting op between consecutive elements of this set, going left to right with the start value z on the left:
op(...op(z, x_1), x_2, ..., x_n)
where x1, ..., xn are the elements of this set.
不錯。對於Kevin來說很清楚:因爲在Sets上沒有定義的順序,你應該*不*使用SetExtractor的實際值,例如'Set SetExtractor(1,xs @ _ *)=> ...';它恰好與'Set(1,2,3)'一起工作,但通常不起作用,例如用'Set(1,2,3,4,5)'。丹尼爾提供這種方式可以讓解構綁定從集合中挑選任意元素。還要注意其餘的xs是一個ArrayBuffer,所以如果你想把它作爲一個Set使用'xs.toSet'。 – AmigoNico 2013-03-02 19:40:15