有没有一种方法可以在Scala中评估任意字符串,就像将相同的文本输入到Scala REPL中一样?我的意思是,我想做这样的事情:
scala> eval("val x = 42")
scala> x
res2: Int = 42
由于Scala REPL使用jline(我认为)在评估循环中接受命令,然后编译/解释它,因此必须有一种提交任意文本行的方法。如果必要,我愿意破解Scala REPL。
有没有一种方法可以在Scala中评估任意字符串,就像将相同的文本输入到Scala REPL中一样?我的意思是,我想做这样的事情:
scala> eval("val x = 42")
scala> x
res2: Int = 42
由于Scala REPL使用jline(我认为)在评估循环中接受命令,然后编译/解释它,因此必须有一种提交任意文本行的方法。如果必要,我愿意破解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版本以来,此方法可行。
val
的字符串,并使该变量对REPL可见(如果我错了,请纠正我)。 - Travis Brown