【问题标题】:Why does Scala match fail for tuple为什么 Scala 匹配元组失败
【发布时间】:2019-01-27 06:51:42
【问题描述】:

我正在使用元组探索匹配功能,但我似乎无法理解为什么这会引发错误:

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

如果有人能解释为什么这不起作用,将不胜感激?

【问题讨论】:

    标签: scala pattern-matching tuples


    【解决方案1】:

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

    已编辑以修复 cmets 中指出的错误

    【讨论】:

    • 这确实有效,这让我认为它在我的案例中失败了,因为我在做 t match ... 并且在我的案例中,我没有将它与元组进行比较,感谢您指出
    • 第二种情况可能应该检查元组的第二个值:case (_, a)
    【解决方案2】:

    TL;DR你必须match一个thing与一个不同的thing(或者一个thing的描述)。你不能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 可以匹配。如果第一个匹配,那么其余的都不会被测试。

    【讨论】:

      【解决方案3】:
      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")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多