为什么Scala匹配因元组而失败

时间:2018-08-21 06:16:23

标签: scala pattern-matching tuples

我正在探索元组的匹配功能,但我似乎不明白为什么这会引发错误:

val t = (2,3)
val params = t match {
  case t._1 == 2 => println("first element is 2")
  case t._2 == 3 => println("second element is 3")
  case _ => println("no matches")
}

对于匹配语句1和2抛出以下错误

not found: value ==

如果有人能解释为什么这行不通,将不胜感激?

3 个答案:

答案 0 :(得分:2)

您给了match一个简单的条件,但是match表达式需要一个与值匹配的模式以及一个以if开头的可选条件。

所以在您的情况下,它看起来像这样:

val t = (2,3)
val params = t match {
  case (a, _) if a == 2 => println("first element is 2")
  case (_, b) if b == 3 => println("second element is 3")
  case _ => println("no matches")
}
  

经过修改以修正注释中指出的错误

答案 1 :(得分:2)

TL; DR ,您必须match事物与其他事物(或东西)。您不能match带有条件的事物


t match {
  case a => // a and t are the same
}

这将始终匹配,因为可以将t的值放在新变量a中。

t match {
  case (a,b) => // a & b hold the values of the tuple elements
}

仅当t是2元组时,该匹配项才会出现。

t match {
  case (a,b) if a < b => // a & b hold the values of the tuple elements only if a < b
}

仅当t是2元组且元素是可比较的并且第一个元素小于第二个元素时,这才匹配。

还要注意,println()返回Unit,这意味着您的params变量将始终具有相同的空值。让我们将其与您其余的代码一起修复。

val t = (2,3)
val status :String = t match {
  case (a,_) if a == 2 => "first element is 2"
  case (_,b) if b == 3 => "second element is 3"
  case _ => "no matches"
}

请注意,只有一个case可以匹配。如果第一个匹配,则其余任何一个都不进行测试。

答案 2 :(得分:1)

val t = (2,3)
val params = t match {
  case (2, _) => println("first element is 2")
  case (_, 3) => println("second element is 3")
  case _ => println("no matches")
}