用元组进行Scala模式匹配:在元组中匹配相等的值



我创建了一个函数来检索帕斯卡三角的给定值,我使用了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 {
  // ...
}

rowcolumn具有相同的值时,是否可以定义case ?

我已经尝试在case中使用相同的变量名称,像这样:

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

我也尝试使用row在列中的值,像这样:

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

但是它们不起作用。在第一种情况下,我有一个编译错误,在第二个IDE说,我从match遮蔽变量row

这可能吗?

谢谢。

对于第一个,使用if保护符:

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

对于第二个,当你想匹配一个变量(而不是绑定和隐藏它)时,你可以使用反引号('):

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

您可以使用保护,它是case表达式的一部分,可以检查非稳定条件,并且不奇怪地类似于if语句:

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

请注意,不匹配此保护的输入(即x != y)将继续检查其他情况,因此,例如,case (x, y) => ...可以跟随另一个情况,并假设x != y

最新更新