繁体   English   中英

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

[英]Why does Scala match fail for tuple

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

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 ==

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

您为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")
}

编辑以修复注释中指出的错误

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可以匹配。 如果第一个匹配,则将不测试其余任何一个。

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")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM