2016-08-20 10 views
3

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

Моя функция, основанная 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.

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

Спасибо.

ответ

3

Для первого, используйте, если охранник:

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

Для второго, когда вы хотите, чтобы соответствовать переменной (вместо связывания и теневое его), вы можете использовать обратные кавычки (`):

(1, 2) match { case (_, `row`) => 1; ... } 
2

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

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

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

Смежные вопросы