[英]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.