Scala模式与元组匹配:在元组中匹配相等的值

时间:2016-08-20 14:08:16

标签: scala pattern-matching

我创建了一个从Pascal Triangle中检索给定值的函数,并且我使用了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 {
  // ...
}

是否可以在caserow具有相同值时定义column

我尝试在case中使用相同的变量名称,如下所示:

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

我还试图在列中使用row的值,如下所示:

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

但他们不起作用。在第一种情况下,我有一个编译错误,在第二种情况下,IDE说我正在从row隐藏变量match

这可能吗?

感谢。

2 个答案:

答案 0 :(得分:2)

对于第一个,请使用if guard:

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

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

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

答案 1 :(得分:1)

您可以使用后卫,它是案例表达式的一部分,可以检查非稳定条件,并且不会出乎意料地类似于if语句:

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

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