代码之家  ›  专栏  ›  技术社区  ›  philantrovert

scala中的嵌套字符串插值

  •  0
  • philantrovert  · 技术社区  · 8 年前

    我正在对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}
    

    下一步我要替换 $$$ 具有 $ ,所以我只剩下一些东西:

    queryResult = "Database is ${DBASE} and frequency is ${FREQ}"
    

    如何在上使用字符串插值 DBASE FREQ 是吗?我试过:

    val substituted = f"${queryResult}"
    

    val substituted = s"${queryResult}"
    

    但变量并没有被取代。除了使用以下工具,我还能做些什么吗?

    queryResult.replaceAll("\\$\\{DBASE\\}", DBASE).replaceAll(...)
    
    3 回复  |  直到 8 年前
        1
  •  4
  •   som-snytt    8 年前

    其中一个选项是让脚本执行模板:

         ________ ___   / /  ___  
        / __/ __// _ | / /  / _ | 
      __\ \/ /__/ __ |/ /__/ __ | 
     /____/\___/_/ |_/____/_/ | | 
                              |/  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
    

    绑定对象的类型不是很好,但您可以进行强制转换或其他操作,并执行更多计算:

    scala> se.eval("""s"Db is $DBASE, freq is ${FREQ.toString * 2}"""", b)
    res4: Object = Db is my_db, freq is monthlymonthly
    
        2
  •  1
  •   Andrey Tyukin    8 年前

    scala的字符串插值

    s"Database is ${DBASE} and frequency is ${FREQ}"
    

    本质上只是方法调用的奇特语法 StringContext 是的。它会像

    StringContext("Database is ", " and frequency is ",  "").s(DBASE, FREQ)
    

    理论上你可以把绳子分开 "Database is ${DBASE} and frequency is ${FREQ}" 变成适合的碎片 字符串上下文 ,然后查找变量 DBASE FREQ 在某个地方,似乎更容易 replaceAll 事件 $$${DBASE} $$${FREQ} 马上。

        3
  •  0
  •   Chaitanya    8 年前

    我认为不可能像编译时那样动态地插入字符串。

    1)字符串插值发生在编译时,因此编译器通常没有足够的信息来插值s(queryresult)。它需要一个字符串文本,根据 https://docs.scala-lang.org/sips/string-interpolation.html 是的。

    2)在文档的高级用法下,解释了在编译时将表单id“hello$name.”的表达式转换为新的stringcontext(“hello”,“)。ID(名称)。

    所以你可以创造

    StringContext("Database is ", " and frequency is ",  "").s(DBASE, FREQ)
    

    这将取代句法暗示。希望能有所帮助。

    推荐文章