Использование операторов сравнения в системе сопоставления шаблонов Scala
можно ли сопоставить при сравнении с помощью системы сопоставления шаблонов в Scala? Например:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
второй оператор case является незаконным, но я хотел бы иметь возможность указать "когда a больше, чем".
3 ответа:
вы можете добавить охрану, т. е.
if
и логическое выражение после шаблона:a match { case 10 => println("ten") case x if x > 10 => println("greater than ten") case _ => println("less than ten") }
Edit: обратите внимание, что это более чем поверхностно отличается от размещения
if
после the=>
, потому что шаблон не матч, если охранник не верно.
как не ответ на дух вопроса, который спросил, Как включить предикаты в предложение соответствия, в этом случае предикат может быть учтен перед
match
:def assess(n: Int) { println( n compare 10 match { case 0 => "ten" case 1 => "greater than ten" case -1 => "less than ten" }) }
теперь документация
scala.math.Ordering.compare(T, T)
обещает только, что неравные результаты будут больше или меньше нуля. В JavaComparable#compareTo(T)
определяется аналогично Скала. Это происходит с обычными использовать 1 и -1 для положительные и отрицательные значения, соответственно, как текущая реализация делает, но нельзя сделать такое предположение без некоторого риска изменения реализации снизу.
решение, которое, на мой взгляд, гораздо более читаемо, чем добавление охранников:
(n compare 10).signum match { case -1 => "less than ten" case 0 => "ten" case 1 => "greater than ten" }
Примечания:
Ordered.compare
возвращает отрицательное целое число, если это меньше, положительное, если больше, и0
Если равны.Int.signum
сжимает выход изcompare
до-1
для отрицательного числа (менее 10),1
для положительного (больше 10), или0
к нулю (равен 10).