【发布时间】:2009-12-16 21:25:30
【问题描述】:
场景:例如,我正在解析一个 IL 并希望从基于堆栈的表示转换为 CFG。
我的 IL 由多个操作组成,例如 PushInt(value)、Pop 等。现在的问题是哪种实现在 Scala 方面是正确的。我很想使用案例类/对象或提取器,这样我就可以编写代码了
op match {
case PushInt(x) => doSomethingWith x
case Pop => ...
}
现在问题存在于类似PushInt(1) :: PushInt(1) :: Pop :: Pop 的序列中,因为 PushInt(1) 等于 PushInt(1) 并且我不能将多个(相等的)操作添加到集合中。但是我知道我正在丢弃一些信息,即流中的位置,但这会隐式存储为序列中的 te 索引。
一种可能的解决方案是重写 hashCode 方法并打破 equal/hashCode 的规则。我对此并不满意。
另一种选择是在抽象库中存储一个“创建时间”计数器,以便
case class PushInt(value: Int) extends AbstractOp(AbstractOp.nextIndex)使用提取器,但在这种情况下,我会错过一些不错的功能,例如 hashCode、equals、toString 的实现,以及更重要的是检查穷举匹配。
所以我现在的问题是如何根据我的要求为我的结构建模。就 Scala 而言,任何可能的解决方案是否“正确”?
【问题讨论】:
-
不能在一个集合中添加多个相等的操作?不是只有当集合是 Set 时才会这样吗?
-
不行,在序列中求indexOf就更惨了。如果对象相等,这当然是正确的。
-
List 中当然可以有重复的相同元素。
-
使用显式定义的提取器与使用案例类与编译器对穷举匹配的检查是正交的。这取决于要匹配的实例类型定义中的密封关键字。
-
Joa,这个问题太模糊了,假设太多。什么是 IL?为什么不能在集合中添加多个相等的操作?你到底想做什么?坦率地说,您的要求没有说明。
标签: scala