Set
non è un case class
e non avere un metodo unapply
.
Queste due cose implicano che non è possibile eseguire lo schema di corrispondenza direttamente su Set
.
(aggiornamento: a meno che non si definisce il proprio estrattore per Set
, come Daniel mostra correttamente nella sua risposta)
Si dovrebbe trovare un'alternativa, io suggerirei utilizzando una funzione di piegatura
def union(s: Set[Int], t: Set[Int]): Set[Int] =
(s foldLeft t) {case (t: Set[Int], x: Int) => t + x}
Questo si accumulano gli elementi di s
sopra t
, aggiungendo uno per uno
pieghevole
Ecco la docs per l'operazione di piegatura, se necessario per riferimento:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
applica un operatore binario a un valore iniziale e tutti gli elementi di questa serie, andando da sinistra a destra.
Nota: potrebbe restituire risultati diversi per esecuzioni diverse, a meno che il tipo di raccolta sottostante non sia ordinato. o l'operatore è associativo e commutativo.
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.
fonte
2013-03-01 18:02:16
Bello. Giusto per essere chiari per Kevin: poiché non esiste un ordine definito sui Set, dovresti * non * usare SetExtractor con valori reali, ad es. 'caso SetExtractor (1, xs @ _ *) => ...'; capita di lavorare con 'Set (1,2,3)' ma non funzionerà in generale, ad es. con 'Set (1,2,3,4,5)'. Daniel offre questo come un modo per consentire a un legatore decostruttivo di scegliere un elemento arbitrario da un Set. Nota anche che il resto, xs, è un ArrayBuffer, quindi se lo vuoi come Set usa 'xs.toSet'. – AmigoNico