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では、マクロを使用してこれを行うことができます。マクロは、コンパイル時に実行されるコードの一部です。

それが賢明なことであるかどうかは、まったく別の質問です(コンパイル時に利用できるからといって、必ずしも実行時に利用できるとは限りません。その逆も同様です)。ビルドツールで何かを行うというRichardの提案は、おそらくもっと賢明だと思います。

于 2012-10-13T16:01:46.127 に答える
0

いいえ、コンパイラにこのチェックをさせることはできません。

はい、ant/maven/buildr/sbt でこのチェックを行うことができます。

詳細が必要な場合は、ビルド ツールに関する情報を提供してください。

于 2012-10-13T15:05:41.707 に答える