【问题标题】:Scala multiline string placeholderScala 多行字符串占位符
【发布时间】:2011-08-16 15:02:10
【问题描述】:

此问题与 (Why is there no string interpolation in Scala?) 有关,但更具体地处理多行字符串。

我刚刚接受了 Martin 关于简单字符串占位符的建议 msg = "你好 {name}!"

在今天的 Scala 中可以像这样表示,没有太大区别: msg = "你好"+名字+"!"

但是,我认为这种方法不适用于多行字符串。而且,在某些情况下,它可能会鼓励其他有利于可读性的不良做法。请注意,在 Scala Play ANORM 数据库映射中,框架如何尝试在普通 SQL 中保留可读性(使用占位符),但以复制 {countryCode} 变量名称和以非类型安全的方式为代价,请参阅... .on("countryCode" -> "FRA")

SQL(
    """
        select * from Country c 
        join CountryLanguage l on l.CountryCode = c.Code 
        where c.code = {countryCode};
    """
 ).on("countryCode" -> "FRA")

另外,假设 Scala 没有改变来解决这个问题,那么使用内联 XML 会有什么影响?性能,内存等如何:

val countryCode = "FRA"
SQL(<c>        
  select * from Country c 
  join CountryLanguage l on l.CountryCode = c.Code 
  where c.code = {countryCode};
</c>.text)

【问题讨论】:

标签: scala playframework multilinestring anorm


【解决方案1】:

将构造一个 scala.xml.Elem,其中字符串内容表示为一个 ArrayBuffer,每个 {} 替换都被切碎。我当然没有权威,但我相信会发生的事情是在构建对象时会有一些额外的开销,然后在运行时获取孩子并将它们连接在一起,但至少在这个例子中,一旦它被传递给 SQL然后提取它想要的字符串的函数(或者这可能会通过隐式完成)Elem 对象将被丢弃,因此会有一些额外的内存使用,但只是短暂的。

但从更大的角度来看,我不认为性能会阻碍该解决方案的采用,但我想很多人会不愿意通过使用虚构的标签以这种方式滥用 XML。问题在于其他用户稍后阅读代码试图找出标签的语义......只是发现没有。

【讨论】:

    【解决方案2】:

    您给出的示例几乎可以肯定不是进行字符串连接,而是创建参数化 SQL 语句(可能通过 JDBC 的 PreparedStatement)。

    具有讽刺意味的是,在这种情况下,缺乏简单的字符串连接可能会稍微鼓励最佳实践(尽管我当然不会将其用作该主题的任何一种论点)。

    【讨论】:

    • 请说明您如何看待在这种情况下缺乏字符串连接鼓励最佳实践。
    【解决方案3】:

    如果你是从未来开始回答这个问题,现在多行字符串插值就是一件事。

    val when = "now"
    println(s"""this is $when a thing.""")
    // this is now a thing
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2012-12-28
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多