2

这个问题与(为什么 Scala 中没有字符串插值?)有关,但更具体地处理多行字符串。

我刚刚接受了 Martin 对简单字符串占位符的建议,其中 msg = "Hello {name}!"

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

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

3 回答 3

0

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

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

于 2011-05-02T04:30:29.257 回答
0

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

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

于 2011-05-01T21:34:05.303 回答
0

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

val when = "now"
println(s"""this is $when a thing.""")
// this is now a thing
于 2019-01-31T06:46:36.990 回答