变量值的字符串插值

问题描述

我希望通过字符串插值来处理变量值。

val temp = "1 to 10 by 2"
println(s"$temp")

预期输出

inexact Range 1 to 10 by 2

但是得到

1 to 10 by 2

有什么办法可以做到这一点?

编辑 使用StringContext的正常情况是:

$> s"${1 to 10 by 2}"
inexact Range 1 to 10 by 2

这将返回范围从1到10,步长值为2。

并且String上下文不适用于变量,所以有没有办法可以我喜欢

$> val temp = "1 to 10 by 2"
$> s"${$temp}"   //hypothetical

这样,口译员会将其评估为

s"${$temp}"  => s"${1 to 10 by 2}" => Range from 1 to 10 by step of 2 = {1,3,5,7,9}

解决方法

通过将字符串值设置为 temp ,您可以做到这一点-创建一个平面字符串。如果您希望将其作为实际代码,则需要删除引号:

val temp = 1 to 10 by 2

然后您可以打印结果:

println(s"$temp")

这将打印以下输出字符串:

inexact Range 1 to 10 by 2

这是表示 Range 的变量的toString(...)输出。如果要打印 1到10 by 2 计算的实际结果,则需要执行以下操作:

val resultsAsString = temp.mkString(",")
println(resultsAsString)
> 1,3,5,7,9

甚至是这样(请注意:这里的大括号{}不是用于字符串插值,而只是用作普通的字符串字符):

println(s"{$resultsAsString}")
> {1,9}

修改 如果您想要实时实际地解释/编译Scala代码(尽管出于安全原因,不建议这样做),那么您可能对此感兴趣: https://ammonite.io/-Ammonite,Scala脚本

无论如何,要从字符串解释代码,您可以尝试使用以下代码: https://docs.scala-lang.org/overviews/repl/embedding.html

请参阅以下几行:

val scripter = new ScriptEngineManager().getEngineByName("scala")
scripter.eval("""println("hello,world")""")