Czy możliwe jest dopasowanie w porównaniu przy użyciu systemu dopasowywania wzorców w Scali? Na przykład:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
Drugie stwierdzenie przypadku jest niedozwolone, ale chciałbym móc określić „kiedy a jest większe niż”.
scala
pattern-matching
Zgodne twierdzenie
źródło
źródło
case x if x.size > 2 => ...
Odpowiedzi:
Możesz dodać strażnika, czyli
if
wyrażenie boolowskie po wzorcu:Edycja: Należy pamiętać, że jest to więcej niż powierzchownie różni się położyć
if
po=>
, ponieważ wzorzec nie pasuje, jeśli strażnik nie jest prawdą.źródło
Jako brak odpowiedzi na ducha pytania, który pytał, jak włączyć predykaty do klauzuli dopasowania, w tym przypadku predykat można rozłożyć przed
match
:Teraz dokumentacja
scala.math.Ordering.compare(T, T)
obiecuje tylko, że nierówne wyniki będą większe lub mniejsze od zera . JavaComparable#compareTo(T)
jest określana podobnie do Scali. Zdarza się, że używa się odpowiednio 1 i -1 dla wartości dodatnich i ujemnych, tak jak ma to miejsce w obecnej implementacji Scali , ale nie można przyjąć takiego założenia bez ryzyka, że implementacja zmieni się od spodu.źródło
compare()
icompareTo()
nie określać 0, 1 i -1 jako ich kodomeny.Rozwiązanie, które moim zdaniem jest dużo bardziej czytelne niż dodanie osłon:
Uwagi:
Ordered.compare
zwraca ujemną liczbę całkowitą, jeśli jest mniejsza od tego, dodatnią, jeśli jest większa i0
jest równa.Int.signum
kompresuje wynik odcompare
do-1
dla liczby ujemnej (mniejszej niż 10),1
dla wartości dodatniej (większej niż 10) lub0
dla zera (równej 10).źródło
O ile wszystkie powyższe i poniższe odpowiedzi doskonale odpowiadają na pierwotne pytanie, kilka dodatkowych informacji można znaleźć w dokumentacji https://docs.scala-lang.org/tour/pattern-matching.html , jednak nie pasowały one do mojego przypadku ale ponieważ ta odpowiedź stackoverflow jest pierwszą sugestią w Google, chciałbym zamieścić swoją odpowiedź, która jest narożnym przypadkiem powyższego pytania.
Moje pytanie brzmi:
Które można sparafrazować:
Odpowiedzią jest poniższy przykład kodu:
link do scala fiddle: https://scalafiddle.io/sf/G37THif/2 jak widać,
case xs if n <= 0 => xs
instrukcja może używać n (argument funkcji) z instrukcją guard (if).Mam nadzieję, że to pomoże komuś takiemu jak ja.
źródło