Scala 中的嵌套字符串插值

phi*_*ert 0 scala string-interpolation

我正在 RDBMS 上执行查询并获取字符串形式的结果。字符串看起来像这样:

val DBASE = "my_database"
val FREQ = "monthly"
val queryResult: String = sqlContext.read.jdbc(...).collect.map(...).first
// queryResult = Database is $$${DBASE} and frequency is $$${FREQ}
Run Code Online (Sandbox Code Playgroud)

接下来我将替换$$$$,所以我留下类似的内容:

queryResult = "Database is ${DBASE} and frequency is ${FREQ}"
Run Code Online (Sandbox Code Playgroud)

如何在DBASE和上使用字符串插值FREQ?我努力了:

val substituted = f"${queryResult}"
Run Code Online (Sandbox Code Playgroud)

val substituted = s"${queryResult}"
Run Code Online (Sandbox Code Playgroud)

但变量并没有被替换。除了使用以下内容之外,我还能做些什么:

queryResult.replaceAll("\\$\\{DBASE\\}", DBASE).replaceAll(...)
Run Code Online (Sandbox Code Playgroud)

som*_*ytt 5

一种选择是让脚本编写模板:

     ________ ___   / /  ___  
    / __/ __// _ | / /  / _ | 
  __\ \/ /__/ __ |/ /__/ __ | 
 /____/\___/_/ |_/____/_/ | | 
                          |/  version 2.12.6

scala> import javax.script._
import javax.script._

scala> val se = new ScriptEngineManager().getEngineByName("scala")
se: javax.script.ScriptEngine = scala.tools.nsc.interpreter.Scripted@6549ce71

scala> val b = se.createBindings
b: javax.script.Bindings = javax.script.SimpleBindings@2648aa1b

scala> b.put("DBASE", "my_db")
res0: Object = null

scala> b.put("FREQ", "monthly")
res1: Object = null

scala> se.eval("""s"Db is $DBASE, freq is $FREQ"""", b)
res2: Object = Db is my_db, freq is monthly
Run Code Online (Sandbox Code Playgroud)

绑定对象的类型不正确,但您可以进行强制转换或进行更多计算:

scala> se.eval("""s"Db is $DBASE, freq is ${FREQ.toString * 2}"""", b)
res4: Object = Db is my_db, freq is monthlymonthly
Run Code Online (Sandbox Code Playgroud)