我正在探索元组的匹配功能,但我似乎不明白为什么这会引发错误:
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 ==
如果有人能解释为什么这行不通,将不胜感激?
答案 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")
}