为什么Scala中没有字符串插值?

时间:2010-03-20 01:05:18

标签: scala language-features language-design

这不仅仅是一个空闲的讽刺......我想知道是否有人知道Scala不支持类似于Groovy和其他“语法上更好的Javas”的插值是否存在实际设计原因?

e.g。

var str1 = "World";
var str2 = "Hello, ${str1}";

8 个答案:

答案 0 :(得分:18)

字符串插值在Scala 2.10中。请参阅SIP

如果您使用的是早期的Scala版本,那么还有ScalaEnhancedStrings compiler plugin

答案 1 :(得分:16)

建议的解决方案是在使用+时省略空格。

"a="+a+", b="+b

一直是suggested瑞士键盘布局使这种键入非常自然,因此Scala的创作者不会感到足够的痛苦来证明在这个方向上使语言变得复杂:)

答案 2 :(得分:7)

认为由此产生的额外编译器复杂性一方面不值得获得,另一方面,它的缺席不会过于繁琐。

答案 3 :(得分:7)

我觉得字符串插值是不必要的,因为它不比连接简洁得多:

val str2 = "Hello, ${str1}!"
val str2 = "Hello, "+str1+"!"

争论字符串上的“+”运算符应格式化为没有空格Martin Odersky says

  

使用新约定,需要字符串替换(通常   提出Scala列表)几乎消失了。比较:

"test results: ${result1}, ${result2}"
     

上面的第一个版本。你已经保存了一个角色   替换,几乎不值得新的语法约定。换一种说法,   Scala的字符串替换语法是写的

"+...+"
     

而不是

${...}
     

或其他类似的提案。另一方面,如果你坚持   +周围的空间,故事变得不那么令人信服了。

顺便提一下,请参阅博客文章“String Interpolation in Scala”,其中使用反射进行模拟。

答案 4 :(得分:7)

从Scala 2.10.0开始,Scala执行support String Interpolation

示例:

val name = "James"
println(s"Hello, $name")  // Hello, James

答案 5 :(得分:6)

字符串插值当前正被添加到主干中的Scala,请参阅Martin的this commit,因此它可能在Scala 2.10中可用。另请参阅示例的第一个测试用例:https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/run/stringInterpolation.scala

答案 6 :(得分:1)

Scala确实有类似的XML功能:

val x = doSomeCrazyCalculation
val xml = <foo>{x}</foo>

答案 7 :(得分:0)

考虑只对XML文字进行一次评估。有关处理多行字符串的问题变体,请参阅Scala multiline string placeholder