Можно ли сопоставить сравнение с помощью системы сопоставления с образцом в Scala? Например:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
Второе утверждение case недопустимо, но я хотел бы иметь возможность указать «когда a больше чем».
scala
pattern-matching
BefittingTheorem
источник
источник
case x if x.size > 2 => ...
Ответы:
Вы можете добавить охрану, то есть
if
и логическое выражение после шаблона:Изменить: Обратите внимание , что это больше , чем внешне отличается от положить
if
после=>
, потому что картина не будет соответствовать , если охранник не так.источник
Как не отвечающий духу вопроса, который спрашивал, как включить предикаты в предложение о совпадении, в этом случае предикат может быть разложен до
match
:Теперь документация
scala.math.Ordering.compare(T, T)
только обещает, что неравные результаты будут больше или меньше нуля . JavaComparable#compareTo(T)
указывается аналогично Scala. Случается, что принято использовать 1 и -1 для положительных и отрицательных значений соответственно, как это делает текущая реализация Scala , но такое предположение невозможно сделать без некоторого риска того, что реализация изменится снизу.источник
compare()
иcompareTo()
не указывать 0, 1 и -1 в качестве своего кодомена.Решение, которое, на мой взгляд, гораздо более читабельно, чем добавление охранников:
Ноты:
Ordered.compare
возвращает отрицательное целое число, если оно меньше этого, положительное, если больше, и0
если равно.Int.signum
сжимает выходной сигнал отcompare
до-1
для отрицательного числа (меньше 10),1
для положительного (больше 10) или0
нуля (равного 10).источник
В то время как все приведенные выше и ниже ответы отлично отвечают на оригинальный вопрос, некоторая дополнительная информация может быть найдена в документации https://docs.scala-lang.org/tour/pattern-matching.html , но они не подходят для моего случая но так как этот ответ на stackoverflow является первым предложением в Google, я хотел бы опубликовать свой ответ, который является угловым случаем вопроса выше.
Мой вопрос:
Что можно перефразировать:
Ответ - пример кода ниже:
ссылка на Scala Fiddle: https://scalafiddle.io/sf/G37THif/2, как вы можете видеть
case xs if n <= 0 => xs
оператор может использовать n (аргумент функции) с оператором guard (if).Я надеюсь, что это помогает кому-то, как я.
источник