Сопоставление паттерна Scala с кортежем: сопоставление равных значений в кортеже

scala pattern-matching

1857 просмотра

2 ответа

Я создал функцию для получения заданного значения из треугольника Паскаля, и я использовал ifоператоры. Теперь я хочу реорганизовать функцию, чтобы использовать сопоставление с образцом.

Моя ifоснованная функция выглядит так:

def valueAt(row: Int, column: Int): Int = {
  // ...
  else if (row == column) 1 // last column
  // 
}

Моя вторая версия этой функции, использующая сопоставление с образцом, имеет следующую подпись:

def valueAt2(row: Int, column: Int): Int = (row, column) match {
  // ...
}

Можно ли определить, caseкогда rowи columnимеют одинаковое значение?

Я попытался использовать то же имя переменной в case, как это:

case (x, x) => 1 // last column

И я также попытался использовать значение rowв столбце, например:

case (_, row) => 1 // last column

Но они не работают. В первом случае у меня ошибка компиляции, а во втором IDE говорит, что я скрываю переменную rowиз match.

Это возможно?

Благодарю.

Источник Размещён: 08.11.2019 11:24

Ответы (2)


2 плюса

Решение

Для первого используйте if guard:

(1, 2) match { case (x, y) if x == y => 1; ... }

Во втором случае, когда вы хотите сопоставить переменную (вместо связывания и теневого копирования), вы можете использовать backticks (`):

(1, 2) match { case (_, `row`) => 1; ... }
Автор: Ven Размещён: 20.08.2016 02:18

1 плюс

Вы можете использовать guard , который является частью выражения case, который может проверять нестабильные условия и не удивительно напоминает ifоператор:

 (row, column) match {
    case (x, y) if x == y => 1
    // other cases...
 }

Обратите внимание, что входы, не соответствующие этому защитному элементу (т. Е. Для которых x != y), будут продолжать проверять другие случаи, поэтому, например, case (x, y) => ...может последовать другой случай и предположить x != y.

Автор: Tzach Zohar Размещён: 20.08.2016 02:13
Вопросы из категории :
32x32