【发布时间】: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) => if (modelId >= 0) ... else ...)并检查这是否有帮助。