1

私は Scala 2.10.0-M7 でリフレクションをいじっていてClassSymbol.isCaseClass、scala コンソールで期待どおりに動作するメソッドに出くわしましたが、Java アプリケーションまたは scala スクリプトとして実行された場合はそうではありません。

私は次TestScript.scalaのように定義しました:

import reflect.runtime.currentMirror

case class TestCase(foo: String)

object Test {
  def main(args: Array[String]) {
    val classSymbol = currentMirror.reflect(new TestCase("foo")).symbol
    val isCaseClass = classSymbol.isCaseClass
    println(s"isCaseClass: $isCaseClass")
  }
}

Test.main(Array())

コマンドライン呼び出しで実行すると

$ scala TestScript.scala

私はこの出力を得る:

isCaseClass: false

代わりに、インタラクティブな scala シェルにコードを入力するか、次のようにロードすると:

scala> :load TestScript.scala

次の正しい出力が得られます。

Loading TestScript.scala...
import reflect.runtime.currentMirror
defined class TestCase
defined module Test
isCaseClass: true

それをコンパイルして標準のJavaアプリとして実行すると、再びfalse結果が得られClassSymbol.isCaseます。

私は何が欠けていますか?scala コンソール環境と Java ランタイム環境の違いは何ですか? 実際のアプリケーションで正しい結果を得るにはどうすればよいですか?

4

1 に答える 1

2

https://issues.scala-lang.org/browse/SI-6277

val classSymbol = cm.reflect(new TestCase("foo")).symbol

{ classSymbol.typeSignature }
val isCaseClass = classSymbol.isCaseClass
println(s"isCaseClass: $isCaseClass")

編集: 最後の質問に答えるために、実際のアプリケーションでマイルストーンを使用することはありません。:)

更新。Scala 2.10.0-RC1 以降で修正されました。

于 2012-09-11T21:50:19.383 に答える