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

Ale*_*x R 11 language-features scala language-design

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

例如

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

Yan*_*ang 18

字符串插值在Scala 2.10中.参见SIP.

如果您使用的是早期的Scala版本,那么还有ScalaEnhancedStrings编译器插件.


ret*_*nym 16

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

"a="+a+", b="+b
Run Code Online (Sandbox Code Playgroud)

有人建议使用瑞士键盘布局使这种键入非常自然,因此Scala的创建者感觉不到足够的痛苦来证明在这个方向上使语言变得复杂:)

  • 天啊太可怕了. (11认同)

Dan*_*ral 7

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


Mat*_*t R 7

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

val str2 = "Hello, ${str1}!"
val str2 = "Hello, "+str1+"!"
Run Code Online (Sandbox Code Playgroud)

争论说字符串上的"+"运算符应该没有空格格式化,Martin Odersky说,

使用新约定,字符串替换(通常在Scala列表中提出)的需求几乎消失.相比:

"test results: ${result1}, ${result2}"
Run Code Online (Sandbox Code Playgroud)

与上面的第一个版本.你已经为每个替换保存了一个字符,几乎不值得新的语法约定.换句话说,编写了Scala的字符串替换语法

"+...+"
Run Code Online (Sandbox Code Playgroud)

代替

${...}
Run Code Online (Sandbox Code Playgroud)

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

顺便提一下,请参阅博客文章" Scala中的字符串插值 ",它使用反射进行模拟.

  • 我不认为这种比较在一般情况下是有效的.如果需要插入表达式,则比较应为:"1 + 1 =\{1 + 1}!"``(13个字符)vs"1 + 1 ="+(1 + 1)+"!" `(16个字符) (8认同)
  • 他们确实有一个好点...它只有4个字符而不是3.更好的是Eclipse IDE修改以突出显示"+ ... +"与字符串的正常开始/结束不同! (2认同)

Era*_*dan 7

从Scala 2.10.0开始,Scala确实支持String Interpolation

例:

val name = "James"
println(s"Hello, $name")  // Hello, James
Run Code Online (Sandbox Code Playgroud)


Arj*_*ijl 6

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