在Scala REPL中评估字符串命令

5

有没有一种方法可以在Scala中评估任意字符串,就像将相同的文本输入到Scala REPL中一样?我的意思是,我想做这样的事情:

scala> eval("val x = 42")

scala> x
res2: Int = 42

由于Scala REPL使用jline(我认为)在评估循环中接受命令,然后编译/解释它,因此必须有一种提交任意文本行的方法。如果必要,我愿意破解Scala REPL。


可能有更简单的方法,但最坏的情况下,您总是可以将其写入文件并使用load()函数。 - Tal Pressman
2个回答

14

无需使用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版本以来,此方法可行。


2
另一个选择是使用Twitter Utility中的Eval:链接
val x: Int = new Eval()("1 + 1")

我认为没有办法使用Eval来完成问题所要求的操作 - 即评估定义val的字符串,并使该变量对REPL可见(如果我错了,请纠正我)。 - Travis Brown
@TravisBrown 你是对的:无法达到相同的舒适度水平。 - om-nom-nom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接