【问题标题】:String interpolation of variable value变量值的字符串插值
【发布时间】:2020-08-12 10:16:16
【问题描述】:

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

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。

而且字符串上下文不适用于变量,所以有没有办法我可以这样做

$> 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}

【问题讨论】:

  • 里面有什么逻辑吗?您是否需要检测“范围不准确”?如果是这样,请描述该逻辑(并提供更多示例)。如果没有,s"inexact Range $temp".
  • @Thilo:我添加了编辑,请看一下。
  • 所以您的问题非常具有误导性。您想计算来自文件的任意 Scala 代码。这基本上是 REPL 的工作。您需要编译它然后运行它。或者可能不是任意代码,而是只是范围的小语法?然后,您需要为该语法编写一个小型解析器。 - 无论如何,这个问题应该关闭,因为它不清楚并打开一个新问题,其中包含你真正需要做的所有细节,并展示你解决它的尝试。

标签: scala string-interpolation


【解决方案1】:

通过将字符串值设置为 temp,您就是在这样做 - 创建一个扁平字符串。如果您希望这是实际代码,则需要删除引号:

val temp = 1 to 10 by 2

然后就可以打印结果了:

println(s"$temp")

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

inexact Range 1 to 10 by 2

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

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

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

println(s"{$resultsAsString}")
> {1,3,5,7,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")""")

【讨论】:

  • Michal Januszewski ,不,val temp 的值将从文本文件中给出。我想要的是val temp = "???",它应该根据它可以是什么值来处理它。
猜你喜欢
  • 2019-06-03
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多