【问题标题】:Exhaustiveness check for pattern matching in Scala 2.11Scala 2.11 中模式匹配的详尽性检查
【发布时间】:2015-12-01 22:46:04
【问题描述】:

我们有一些模式匹配代码,我们希望编译器警告我们匹配不是详尽的,但我们没有得到。是否存在无法进行详尽检查的情况?

例如,我们的示例(使用梯形 Good+Bad):

(maybeModelIdOrFailure, maybeMake) match {

    case (Some(Good(modelId)), Some(makeId)) if modelId >= 0 && taxonomyService.isValidModel(makeId, modelId) =>
      Good(Some(MakeModelParameters(makeId, Some(modelId), modelLineId = None, index)))

    case (Some(Good(modelLineId)), Some(makeId)) if modelLineId < 0 && taxonomyService.isValidModelLine(makeId, -1 * modelLineId) =>
      Good(Some(MakeModelParameters(makeId, modelId = None, modelLineId = Some(-1 * modelLineId), index)))

    case (Some(Good(modelOrModelLineId)), Some(makeId)) =>
      Bad(One(IdNotFound(modelIdKeyName, modelOrModelLineId)))

    case (Some(Good(modelId)), None) if modelId >= 0 =>
      Bad(One(IdInvalid(modelIdKeyName, "Model Id without Make Id")))

    case (Some(Good(modelLineId)), None) if modelLineId < 0 =>
      Bad(One(IdInvalid(modelIdKeyName, "Model Line Id without Make Id")))

    case (None, Some(makeId)) => Good(Some(MakeModelParameters(makeId, None, None, index)))

    // case (None, None) => Good(None)

    // case (Some(Bad(invalidParams)), _) => Bad(One(invalidParams))
  }

我们注释了最后两行,但编译器没有发出警告,我们也没有禁用任何检查。

【问题讨论】:

  • 它可能与issues.scala-lang.org/browse/SI-7631 相关(尽管它本身不应该有这样的效果)。您可以尝试在分支内移动保护条件(例如case (Some(Good(modelId)), None) =&gt; if (modelId &gt;= 0) ... else ...)并检查这是否有帮助。

标签: scala pattern-matching


【解决方案1】:

Jason Zaugg's comment on SI-9232 看来,警卫目前只是简单地禁用了穷举检查(或几乎如此)。如果是这个原因,在分支内移动保护条件(例如case (Some(Good(modelId)), None) =&gt; if (modelId &gt;= 0) ... else ...)应该会有所帮助。其他相关问题:https://issues.scala-lang.org/browse/SI-5365https://issues.scala-lang.org/browse/SI-7631

【讨论】:

    【解决方案2】:

    看起来如果你在比赛中有任何后卫,scala 会关闭穷举检查。即使这样,我的编译器也不会产生警告:

    def tt(s: Option[Int]) = s match {
      case Some(x) if x > 0 => println(x)
    }
    

    只要我把守卫留在那里。有关于此讨论的门票: https://issues.scala-lang.org/browse/SI-7631 https://issues.scala-lang.org/browse/SI-5365 看起来这里有一些工作要做,所以它可能会改进。在大多数情况下,Scala 编译器无法检查守卫的详尽性,因为这太复杂了,但您的案例绝对证明了它可以改进。

    【讨论】:

    • 是的,谢谢你也是对的。但我已经接受了较早的答案。不过,你得到了我的支持。
    • @longliveenduro Alexey 的评论是第一个,我没有注意到。所以没关系:)
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多