首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala :即使有默认值,也不能检查是否匹配不可实现

Scala :即使有默认值,也不能检查是否匹配不可实现
EN

Stack Overflow用户
提问于 2015-05-03 11:06:40
回答 1查看 89关注 0票数 3

我正在为一门课程编写一个简单语言的编译器,我遇到了这个警告。问题中的模式匹配很简单,所以我不明白为什么会出现这种情况。下面是有问题的模式匹配:

代码语言:javascript
复制
(tcExpr(lhs), tcExpr(rhs)) match {
      case (TInt, TInt) | (TString, TString) | (TBoolean, TBoolean) | (TIntArray, TIntArray) | (TObject(_), TObject(_)) => TBoolean
      case _ => TError

tcExpr签名为def tcExpr(expr: ExprTree, expected: Type*): TypeExprTree表示表达式,Type表示case对象。除了TObject()之外,所有这些都是简单的对象,TObject()以一个表示类的符号作为参数。

我不明白的是,没有那么多的可能性。为什么编译器找不到答案呢?有什么东西我忽略了,或者误解了吗?

非常感谢你的回答,

尼古拉斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-03 11:45:53

我可以复制“警告:不能检查匹配的不可达性”。使用下面的代码(我不知道您有多少类型。我取32 +1作为上限):

代码语言:javascript
复制
trait Type 

case object T0 extends Type
case object T1 extends Type
case object T2 extends Type
case object T3 extends Type
case object T4 extends Type
...
<generated code, 32 types in total>
...
case object T31 extends Type

def foo: Type = T0

(foo, foo) match {
  case (T0,T0) | <total 32 types> | (T31,T31) => println("true")
  case _ => println("false")
}

原因似乎是因为它只是内存不足,试图检查所有可能的情况。警告给出的建议是在运行编译器时添加选项-Dscalac.patmat.analysisBudget=off。只是尝试使用此选项进行编译:它有效,不再有警告。

编辑:通过二分法发现,如果没有选项,它将停止使用>= 5类型.这确实不是太多的记忆。

我的建议是删除这个永远长的枚举,代之以一个简短的公式:

代码语言:javascript
复制
(foo, foo) match {
  case (Obj(_), Obj(_)) => println("true")
  case (x, y) if (x == y) => println("true") // Order is important, thx @Nico
  case _ => println("false")
}

然后警告消失,代码停止溢出超过80个字符/行限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30013098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档