【问题标题】:Missing warning of non-exhaustive match缺少非详尽匹配的警告
【发布时间】:2011-11-28 03:22:09
【问题描述】:

-unchecked 被启用时,为什么以下不产生警告:

object Order {
   sealed trait EntryOption
   case object EmptyEntry extends EntryOption
   trait Entry extends EntryOption

   def isEmpty(a: EntryOption): Boolean = a match {
      case EmptyEntry => true
//    case _: Entry   => false
   }
}

在 Scala 2.8.0 的日子里,我似乎有确切的 same problem before,但没有足够的答案。


编辑

@Jed 仅针对非抽象类Entry 发出警告对我来说没有意义。考虑以下情况:

trait Order {
  sealed trait EntryOption
  case object EmptyEntry extends EntryOption
  abstract sealed class Entry extends EntryOption

  def isEmpty(a: EntryOption): Boolean = a match {
    case EmptyEntry => true
 // case _: Entry   => false
  }
}

trait OrderImpl extends Order {
  final class EntryImpl extends Entry
}

使警告出现的唯一方法是在Order 中有一个具体的类Entry

【问题讨论】:

标签: scala pattern-matching


【解决方案1】:

它确实在后备箱上抱怨:

scala> object Order {
     |    sealed trait EntryOption
     |    case object EmptyEntry extends EntryOption
     |    trait Entry extends EntryOption
     | 
     |    def isEmpty( a: EntryOption ) : Boolean = a match {
     |       case EmptyEntry => true
     | //    case _: Entry   => false
     |    }
     | }
<console>:18: warning: match is not exhaustive!
missing combination          Entry

          def isEmpty( a: EntryOption ) : Boolean = a match {
                                                    ^
defined module Order

【讨论】:

  • 啊,太好了,然后它被修复了。现在就等到“2012 年初”;)
  • @Sciss 实际上,我很确定 Scala 2.10 将附带 virtpatmatch,它不会遇到这个问题(或 任何 众多其他模式匹配错误)全部。当然,它可能会带来一组新的问题! :-)
  • 嗯,现在你让我好奇了——什么是 virtpatmatch? (事实上​​昨天我需要在一个明显误报的地方添加@unchecked
  • @Sciss 现在,唯一可以查找的地方就是源代码本身。一旦 Adriaan 花时间写了一些关于它的文件,那么我就可以分享它了。 :-)
【解决方案2】:

Entry 是一个特征,而不是一个案例类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多