【问题标题】:Explain strange Scala compiler behaviour解释奇怪的 Scala 编译器行为
【发布时间】:2011-08-14 08:01:14
【问题描述】:

我正在 Eclipse 中使用 Scala 2.9.0.1。

我有一个 Scala 类/特征层次结构,类似于:

A.scala: trait A
B.scala: trait B extends A
C.scala: trait C extends B

除了更复杂;太大,无法作为示例发布。

所以,C 间接依赖于 A,但 A 对 C 一无所知。

现在,如果我更改 A,我到处都会出错,所以我继续努力。一旦我最终修复了 C 中的最后一个错误,编译器突然告诉我 A 无法编译。由于 A 不以任何方式依赖于 C,因此这没有逻辑意义。事实上,我会说这是一个编译器错误。这在我身上发生了好几次,非常令人沮丧,因为这意味着我必须再次更改 A,并再次修改我的整个类层次结构。

有没有办法让 Scala 编译器(在 Eclipse 中)给我可靠的结果?只有我有这种行为吗?

【问题讨论】:

  • Eclipse 中的 Scala IDE 仍处于测试阶段。我听说开发团队将包含一个 SBT 风格的文件依赖跟踪基础设施,它可能会解决这些问题。
  • 最新的夜间构建确实包括应该处理这些问题的实验性 sbt 构建器。每晚安装最新版本,在 Preferences > Scala > Compiler > Build manager 中选择 sbt。如果您仍然看到类似的问题,请创建一个展示问题的小示例并向 Scala IDE 问题跟踪器报告。
  • 您使用的是哪个版本的 Eclipse 和 Scala 的 Eclipse 插件?这是非常重要的一点——您遇到的是 eclipse 插件 错误,而不是 scala 编译器错误。

标签: eclipse scala compiler-errors


【解决方案1】:

我还观察到 Scala 程序可能有“层次结构”的错误,其中某些编译错误在其他错误得到修复之前不会被发现。 这不一定是编译器错误其他人说这可能是旧 Scala IDE 构建器的错误,已在主干中修复。)

一种策略是逐步进行更改:

  1. 复制trait A 并将其命名为trait A2
  2. A2 进行所需的更改,修复出现的任何编译错误。这很容易,因为目前还没有任何东西依赖于 A2
  3. 重复B2C2等。

一切正常后,将原始特征替换为修改后的特征。修订控制(我使用 git)在这个过程中非常有帮助。

另一个我觉得有用的通用策略是将设计分为两个阶段:

  1. 首先,我只对类型进行编码,将所有方法体留空。在出现任何实际代码之前修复类型错误要容易得多。

  2. 只要类型一致,我就可以独立填写方法定义,不用担心复杂的编译错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多