有沒有一種方法來評估Scala中的任意字符串,就好像相同的文本直接輸入到Scala REPL中一樣?我的意思是,我願做這樣的事情:從REPL評估Scala中的字符串命令
scala> eval("val x = 42")
scala> x
res2: Int = 42
由於斯卡拉REPL使用的JLine(我相信)接受在一個eval循環命令,然後編譯/解釋它,必須有辦法提交任意一行文字。如果有必要,我願意破解Scala REPL。
有沒有一種方法來評估Scala中的任意字符串,就好像相同的文本直接輸入到Scala REPL中一樣?我的意思是,我願做這樣的事情:從REPL評估Scala中的字符串命令
scala> eval("val x = 42")
scala> x
res2: Int = 42
由於斯卡拉REPL使用的JLine(我相信)接受在一個eval循環命令,然後編譯/解釋它,必須有辦法提交任意一行文字。如果有必要,我願意破解Scala REPL。
沒有REPL黑客必要,只需切換到超級用戶模式,使您可以訪問到當前scala.tools.nsc.interpreter.IMain
爲intp
:
scala> :power
** Power User mode enabled - BEEP BOOP SPIZ **
** :phase has been set to 'typer'. **
** scala.tools.nsc._ has been imported **
** global._ and definitions._ also imported **
** Try :help, vals.<tab>, power.<tab> **
scala> intp.interpret("val x = 42")
x: Int = 42
res0: scala.tools.nsc.interpreter.package.IR.Result = Success
scala> x
res1: Int = 42
這工作,因爲至少2.9.1。
真棒!太棒了。正是我在找什麼。非常感謝! – Jim 2012-08-12 22:43:40
另一個機會是使用Eval從Twitter工具:
val x: Int = new Eval()("1 + 1")
我不認爲有什麼辦法可以使用Eval來完成問題所要求的 - 評估一個定義「val」的字符串並讓該變量對REPL可見(如果我錯了,請糾正我)。 – 2012-08-12 17:19:39
@TravisBrown你是對的:同樣的舒適程度是不可能的。 – 2012-08-14 21:42:59
有可能是一個更簡單的方法,但最糟糕的情況下,你可以隨時將其寫入到一個文件,並使用load()方法 – 2012-08-12 15:55:22