Расширяя один из комментариев, и чтобы напрямую ответить на ваш вопрос, вам нужно будет сопоставить шаблон следующим образом:
def isDivisible(x: Int, y: Int): Boolean = (x, y) match {
case (a, b) if a % b == 0 => true
case _ => false
}
isDivisible(10, 5)
Вам необходимо сопоставить шаблон по одному значению, поэтому сначала мы нужно обернуть x
и y
в кортеж : (x, y)
.
Первый оператор case
затем должен извлечь значения из этого кортежа и имеет предложение if
, чтобы определить, является ли первое значение (a
, которое сопоставлено со значением x
) делимым на второе значение (b
, которое сопоставлено со значением y
).
Если предложение if
выполнено успешно, функция вернет true
; в противном случае он вернет false
.
Очевидно, что с точки зрения ресурсов кодирования и выполнения неэффективно использовать сопоставление с шаблоном в данном конкретном случае. Это связано с тем, что упаковка аргументов в кортеж, сопоставление с образцом для кортежа и повторное его разбиение полностью избыточны. Мы можем заменить это непосредственно оператором if
:
def isDivisible(x: Int, y: Int): Boolean = if(x % y == 0) true else false
isDivisible(10, 5)
Однако, поскольку значение условия в операторе if
отображается на тот же результат, это тоже избыточно, и мы можем заменить if
с условием:
def isDivisible(x: Int, y: Int): Boolean = x % y == 0
isDivisible(10, 5)
Кроме того, вы можете сопоставить шаблон по результату расчета модуля:
def isDivisible(x: Int, y: Int): Boolean = x % y match {
case 0 => true
case _ => false
}
isDivisible(10, 5)
Обратите внимание, что все вышеперечисленное версии этой функции завершатся с ArithmeticException
, если y
равно 0. Вы можете обработать этот случай, используя сопоставление с образцом:
def isDivisible(x: Int, y: Int): Boolean = y match {
case 0 => false // Treat division by zero as indivisible.
case _ => x % y == 0
}
isDivisible(10, 0)