Использование операторов сравнения в системе сопоставления шаблонов Scala


можно ли сопоставить при сравнении с помощью системы сопоставления шаблонов в Scala? Например:

a match {
    case 10 => println("ten")
    case _ > 10 => println("greater than ten")
    case _ => println("less than ten")
}

второй оператор case является незаконным, но я хотел бы иметь возможность указать "когда a больше, чем".

3 133

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) обещает только, что неравные результаты будут больше или меньше нуля. В Java Comparable#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).