Scala多行字符串占位符

时间:2011-05-01 21:17:00

标签: scala playframework multilinestring anorm

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

我刚刚接受了Martin对简单字符串占位符的建议     msg =“Hello {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)

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您提供的示例几乎肯定正在进行字符串连接,它正在创建参数化的SQL语句(可能通过JDBC的PreparedStatement)。

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

答案 2 :(得分:0)

如果您将来会遇到这个问题,现在多行字符串插值已成问题。

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