【问题标题】:Why does these lines of code freeze the Scala/SBT build?为什么这些代码行会冻结 Scala/SBT 构建?
【发布时间】:2013-11-18 21:53:26
【问题描述】:

从 Play Framework 2.1 转换到 2.2 (Scala) 我正在重组一些代码,并发现一些代码行完全冻结了 SBT 构建,直到由于 java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded 而导致进程被终止。 Eclipse(与 Juno 和 Kepler 一起尝试过,但我怀疑它与此有关)也冻结了,它甚至不再加载工作台了。

所以,这里是代码。我很想知道是什么让编译器死机,而不仅仅是在这里给出错误。

def foo = Action { implicit request =>
  someForm.bindFromRequest.fold(
    formWithErrors => Ok,
    form => Async { Future.successful(Ok) }
    )
}

我已经解决了这个问题,但我很好奇为什么这会冻结一切。我在运行 java (1.7.0_40) 的 Mac 上。

更新:另外,我使用的是 Scala 2.10.2。我的一个同事可以在他的 PC 上编译它,但在 Async 上会出现弃用警告。

【问题讨论】:

  • 我没有解释,但我在迁移到 2.2 时遇到了同样的问题,编译停止并最终出现内存不足异常,但在将其更改为 Action.async 后,应用程序中的一切再次编译就好了。
  • 我也是这样做的,但只是为了对每一个微小的技术细节感到好奇,我很想知道是什么让构建挂起。 Scala 编译器中的错误?
  • 你能提交错误报告吗?我们还需要更多信息来解决这个问题,例如线程转储。
  • 对于那些阅读的人,可以尝试的一件事是升级到最新的 Scala 版本(当前为 2.10.4)。见:scala-sbt.org/0.13.2/docs/Howto/scala.html
  • 我会尽快重现此问题,并且很乐意提交错误报告。

标签: scala playframework sbt playframework-2.2


【解决方案1】:

Scala 中有某些表达式,当您要求编译器评估它们时,它会实例化大量类型实例,试图找出两种类型之间的统一区别。您返回的类型很可能不是您所期望的。

我会明确地注释结果类型:

def foo = Action { implicit request =>
  someForm.bindFromRequest.fold[Result](
    formWithErrors => Ok,
    form => Async { Future.successful(Ok) }
  )
}

这应该有助于类型推断器知道类型是什么,并且只检查它们是否匹配,而不是无限扩展。此外,听起来这可能是一个 scala 编译器错误。

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2012-07-03
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多