我正在为一门课程编写一个简单语言的编译器,我遇到了这个警告。问题中的模式匹配很简单,所以我不明白为什么会出现这种情况。下面是有问题的模式匹配:
(tcExpr(lhs), tcExpr(rhs)) match {
case (TInt, TInt) | (TString, TString) | (TBoolean, TBoolean) | (TIntArray, TIntArray) | (TObject(_), TObject(_)) => TBoolean
case _ => TErrortcExpr签名为def tcExpr(expr: ExprTree, expected: Type*): Type,ExprTree表示表达式,Type表示case对象。除了TObject()之外,所有这些都是简单的对象,TObject()以一个表示类的符号作为参数。
我不明白的是,没有那么多的可能性。为什么编译器找不到答案呢?有什么东西我忽略了,或者误解了吗?
非常感谢你的回答,
尼古拉斯
发布于 2015-05-03 11:45:53
我可以复制“警告:不能检查匹配的不可达性”。使用下面的代码(我不知道您有多少类型。我取32 +1作为上限):
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类型.这确实不是太多的记忆。
我的建议是删除这个永远长的枚举,代之以一个简短的公式:
(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个字符/行限制。
https://stackoverflow.com/questions/30013098
复制相似问题