有没有办法从Scala中评估任意字符串,就像直接在Scala REPL中输入相同的文本一样?我的意思是,我想做这样的事情:
scala> eval("val x = 42")
scala> x
res2: Int = 42
由于Scala REPL使用jline接受eval循环中的命令(我相信)然后编译/解释它,因此必须有一种方法来提交任意一行文本。如果有必要,我愿意破解Scala REPL。
答案 0 :(得分:12)
无需REPL黑客攻击 - 只需切换到超级用户模式,即可以intp
访问当前scala.tools.nsc.interpreter.IMain
:
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。
答案 1 :(得分:2)
另一个机会是使用Twitter Utility中的Eval:
val x: Int = new Eval()("1 + 1")