Czy istnieje sposób na częściowe dopasowanie do tuple
bez konieczności określania rozmiaru? Na przykład, gdybym miał krotkiDopasuj krotkę o nieznanym rozmiarze w scala
val v = ("Dr", "John","H", "Watson")
Chciałbym móc zrobić coś takiego:
v match {
case ("Dr", : _*) => "What's up, Doc?"
case ("Mr", name, :_*) => s"Welcome, Mr. ${name}"
case _ => "Have we met?"
}
To nie kompiluje, :_*
zwykle oznacza nieokreślonej liczby parametrów, ale nie może być w tym przypadku najwyraźniej zastosowany. Pomysł polegałby na tym, aby móc użyć tego narzędzia matującego dla każdej krotki większej niż 2. Wiem, że mogę to zrobić, konwertując najpierw v
na List
(na przykład), chcę tylko wiedzieć, czy można to zrobić za pomocą tuple
.
EDIT: najbardziej informacji znalazłem w internecie jest this discussion, który sięga Scala 2.8, więc będę z „Nie, nie można” odpowiedź.
O ile mi wiadomo, nie ma mowy, ponieważ krotki o różnych rozmiarach są różnymi typami. Ale można to zrobić za pomocą makr - celem jest wygenerowanie kodu, który będzie pasował do wszystkich możliwych rozmiarów. Lub zgodnie z sugestią, określ niejawne konwersje na 'Seq [Any]'. To też jest brudne rozwiązanie i lepiej zadać sobie pytanie, czy krotki są właściwym typem do zastosowania w twoim problemie? Może nie są. –
@SargeBorsch, ale wszystkie one rozszerzają Produkt ;-) –
@ om-nom-nom Tak, to prawda, ale jeśli masz typ Product, nie znasz typów jego elementów i tym samym tracisz bezpieczny dostęp do swoich danych (potrzebujesz ręcznie sprawdzać/odlewać typy jego elementów) –