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

我创建了一个函数来从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 {
  // ...
}

是否有可能定义一个case为,当rowcolumn具有相同的值?

我已经尝试在这种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; ... }

您可以使用警卫 ,它是可以检查非稳定条件的案例表达式的一部分,并且不会令人惊讶地类似于if语句:

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

请注意,与这个守卫不匹配的输入(例如,对于x != y )将继续检查其他情况,因此,例如,可以跟随另一个case (x, y) => ... ,并假定x != y

链接地址: http://www.djcxy.com/p/62639.html

上一篇: Scala pattern matching with tuple: matching equal values in the tuple

下一篇: OCaml pattern reconstruction with let