2012-09-11 65 views
1

我在Scala 2.10.0-M7中玩弄反射,偶然發現了ClassSymbol.isCaseClass方法,它在scala控制檯中表現得像預期的那樣,但不是在作爲java應用程序或scala腳本執行。Scala 2.10反射:ClassSymbol.isCaseClass在scala控制檯中工作,但不在腳本/ app中

我定義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運行時環境有什麼區別?我怎樣才能在真正的應用程序中獲得正確的結果?

回答

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") 

編輯:回答你的最後一個問題,你會不會在實際應用中使用的一個里程碑。 :)

Upd。從Scala 2.10.0-RC1開始修復。

+0

如果作爲java應用程序執行,它會起作用,但如果作爲scala腳本執行,則會出人意料。但是,因爲劇本只是爲了嘗試這個,所以對我來說不是什麼阻礙。關於您的編輯:當然,我不會使用里程碑來創建高效的應用程序;-)對於「真實」,我只是指在JVM上運行的已編譯的工件(例如jar)。 – sven

相關問題