Scala шаблон соответствует случаю уравнения - PullRequest
0 голосов
/ 21 марта 2020

Я хочу сопоставить с шаблоном, если x делится на y, верните true, но у меня неправильный синтаксис, и он продолжает падать.

def isDivisible (x: Int, y: Int) :Boolean = Int match {
    case (x % y == 0) => true
    case _ => false
}

isDivisible(10, 5)

Как правильно определить уравнение как случай

Ответы [ 2 ]

6 голосов
/ 21 марта 2020

Это немного излишне использовать сопоставление с образцом в таком тривиальном примере, просто определите:

def isDivisible(x: Int, y: Int): Boolean = x % y == 0
3 голосов
/ 23 марта 2020

Расширяя один из комментариев, и чтобы напрямую ответить на ваш вопрос, вам нужно будет сопоставить шаблон следующим образом:

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)
...