【问题标题】:Evaluate string command in Scala from REPL从 REPL 评估 Scala 中的字符串命令
【发布时间】:2012-08-12 15:29:00
【问题描述】:

有没有办法评估来自 Scala 的任意字符串,就好像直接将相同的文本输入到 Scala REPL 中一样?我的意思是,我想做这样的事情:

scala> eval("val x = 42")

scala> x
res2: Int = 42

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

【问题讨论】:

  • 可能有更简单的方法,但在最坏的情况下,您始终可以将其写入文件并使用 load()

标签: scala read-eval-print-loop


【解决方案1】:

无需 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 开始有效。

【讨论】:

  • 太棒了!太棒了。正是我想要的。非常感谢!
【解决方案2】:

另一个机会是使用 Twitter Utility 中的Eval

val x: Int = new Eval()("1 + 1")

【讨论】:

  • 我不认为有任何方法可以使用 Eval 来完成问题所要求的 - 评估定义 val 的字符串并使 REPL 可以看到该变量(如果我错了请纠正我)。
  • @TravisBrown 你是对的:同样的舒适度是不可能的。
猜你喜欢
  • 1970-01-01
  • 2013-08-16
  • 2017-07-06
  • 2023-04-09
  • 1970-01-01
  • 2012-04-10
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多