【问题标题】:Why is there no string interpolation in Scala?为什么Scala中没有字符串插值?
【发布时间】:2011-01-29 16:50:49
【问题描述】:

这不仅仅是一句空话……我想知道是否有人知道 Scala 不支持类似于 Groovy 和其他“语法更好的 Java”的插值是否有实际的设计原因?

例如

var str1 = "世界"; var str2 = "你好,${str1}";

【问题讨论】:

标签: scala language-features language-design


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    suggested 瑞士键盘布局使这种打字变得非常自然,因此 Scala 的创建者并没有感到足够的痛苦来证明在这个方向上使语言复杂化是合理的 :)

    【讨论】:

    • 起初我以为“瑞士键盘”是个玩笑,但在阅读了链接的文章后,我决定选择这个作为最佳答案!感谢您深入了解我的问题的核心,即“为什么??” Scala 是否缺少此功能。
    【解决方案3】:

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

    例子:

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

    【讨论】:

      【解决方案4】:

      人们认为,由此产生的额外编译器复杂性一方面不值得获得收益,另一方面,它的缺失也不会造成太大的负担。

      【讨论】:

        【解决方案5】:

        我的感觉是字符串插值是不必要的,因为它并不比串联更简洁:

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

        认为字符串上的“+”运算符应该格式化为不带空格,Martin Odersky says

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

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

        上面的第一个版本。您每保存一个字符 替换,几乎不值得一个新的语法约定。换一种说法, Scala的字符串替换语法是这样写的

        "+...+"
        

        而不是

        ${...}
        

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

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

        【讨论】:

        • Daniel(他在这里给出了第一个答案,显然过于谦虚而无法推广它)也提出了一个解决方案(dcsobral.blogspot.com/2010/01/…)。请注意,它需要 Scala 2.8.0.Beta1 之后的版本。
        • 他们确实有一个好点...它只是 4 个字符而不是 3 个字符。如果 Eclipse IDE 修改突出显示 "+...+" 与正常的字符串开始/结束不同,那就太好了!
        • 我不认为这种比较在一般情况下是有效的。如果需要插入表达式,比较应该是:"1+1=\{1+1}!"(13 个字符)vs "1+1="+(1+1)+"!"(16 个字符)
        • @BenLings:或("1+1="+(1+1)+"!"),因为运算符优先级。
        • 字符串插值更容易阅读,因为整个字符串打开和关闭一次。不是为了节省需要输入的字符数。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          Scala 确实有类似的 XML 特性:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多