1

是否可以让 Scala(或从 Scala 调用的 Java)在编译时检查资源是否丢失,如果丢失则抛出编译错误?

我正在与许多开发人员一起开发一个大型 Java/Scala 混合项目,并且我正在提供一个 Scala 组件,该组件在系统运行接近尾声时启动。因此,如果我的组件抛出缺少资源运行时错误,那么它只是很晚才被发现。我试图确保我的资源在那里,这样就不会发生这种情况。但是已经有好几次了,首席工程师决定改变事情,我的资源改变了路径,我不知道所以没有改变我的代码,然后代码因为缺少资源而在我的组件处死掉了。我们正在致力于更集中的资源控制,但与此同时,是否有可能让 Scala 对丢失的资源抛出编译错误?主要是好奇心,但如果结果足够简单,可能会实施。

ETA:关于构建工具的问题。这并不简单,因为每个人都在使用自己的环境。有些使用eclipse,有些使用netbeans,我使用emacs+sbt。因此,即使我插入了对 sbt 的检查,对使用 eclipse 的其他人来说也没关系。

4

3 回答 3

3

在 2.10 中,借助宏和字符串插值绝对是可能的:

object CheckResource {

  import scala.reflect.macros.Context
  import scala.language.experimental.macros

  implicit class StringResource(sc: StringContext) {
    def res(): String = macro __res
  }

  def __res(c: Context)(): c.Expr[String] = {
    import c.universe._
    val str = c.prefix.tree match {
      case Apply(_, List(Apply(_, List(Literal(Constant(const: String)))))) =>
        if (!new java.io.File(const).exists())
          c.abort(c.enclosingPosition, s"file '$const' does not exist")
        else Literal(Constant(const))
    }
    c.Expr(str)
  }
}

scala> import CheckResource._
import CheckResource._

scala> val file = new java.io.File("test")
file: java.io.File = test

scala> file.createNewFile
res7: Boolean = true

scala> res"test"
res8: String = test

scala> file.delete
res9: Boolean = true

scala> res"test"
<console>:12: error: file 'test' does not exist
              res"test"
              ^
于 2012-10-13T18:02:15.163 回答
2

实际上,您可能可以在 Scala 2.10 中使用宏来执行此操作 - 宏是在编译时运行的一段代码。

这样做是否明智完全是另一个问题(仅仅因为它在编译时可用并不一定意味着它将在运行时,反之亦然?)。我会建议理查德在你的构建工具中做某事的建议可能更明智。

于 2012-10-13T16:01:46.127 回答
0

不,您不能诱导编译器为您进行此项检查。

是的,ant/maven/buildr/sbt 可以为你做这个检查。

如果您想了解更多详细信息,请提供有关您的构建工具的信息。

于 2012-10-13T15:05:41.707 回答