Set
nie jest case class
i nie ma sposobu unapply
.
Te dwie rzeczy sugerują, że nie można dopasować wzoru bezpośrednio na Set
.
(aktualizacja: chyba zdefiniować własną ściągacza dla Set
, jak Daniel poprawnie pokazuje w swojej odpowiedzi)
Powinieneś znaleźć alternatywę, polecam użyciu krotny funkcji
def union(s: Set[Int], t: Set[Int]): Set[Int] =
(s foldLeft t) {case (t: Set[Int], x: Int) => t + x}
to gromadzą się elementy s
na t
, dodając je pojedynczo
składane
Oto docs dla krotnym pracy, jeśli to konieczne dla odniesienia:
foldLeft[B](z: B)(op: (B, A) ⇒ B): B
Dotyczy operatora binarnego do wartości początkowej i wszystkich elementów tego zbioru, idąc od lewej do prawej.
Uwaga: może zwracać różne wyniki dla różnych serii, chyba że zamówiono podstawowy typ kolekcji. lub operator jest asocjacyjny i przemienny.
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.
Nice. Dla Kevina jest jasne: ponieważ nie ma zdefiniowanej kolejności na zestawach, nie należy * używać * SetExtractor z rzeczywistymi wartościami, np. 'case SetExtractor (1, xs @ _ *) => ...'; zdarza się, że działa z 'Set (1,2,3)' ale nie działa ogólnie, np. z 'Set (1,2,3,4,5)'. Daniel oferuje to jako sposób na umożliwienie dekonstrukcji wiązania, aby wybrać dowolny element z zestawu. Zauważ też, że reszta, xs, to ArrayBuffer, więc jeśli chcesz, aby był Set, użyj 'xs.toSet'. – AmigoNico