【问题标题】:String interpolation escape quote PITA字符串插值转义引号 PITA
【发布时间】:2013-10-22 20:17:38
【问题描述】:

字符串插值有一些特殊规则不允许从a + b 风格直接翻译,这让我抓狂:

// ok
def test(f: java.io.File) = {
  val abs = f.getAbsoluteFile
  val isF = abs.isFile
  "select " + (if (isF) "file" else "folder") +"\"" + abs.getName +"\" of folder"
}

// fail
def test(f: java.io.File) = {
  val abs = f.getAbsoluteFile
  val isF = abs.isFile
  s"select ${if (isF) "file" else "folder"} \"${abs.getName}\" of folder"
}

然后是一个可爱的错误消息:

<console>:38: error: value $ is not a member of String
         s"select ${if (isF) "file" else "folder"} \"${abs.getName}\" of folder of the front window"
                                                     ^

这里的 s-string 有什么问题?

【问题讨论】:

    标签: scala string-interpolation


    【解决方案1】:

    问题是您不能在单引号字符串中保留未转义的引号,就像在单词文件和文件夹周围加上引号时所做的那样。尝试使用三引号字符串,它允许在其中包含未转义的引号(它仅由第二个三重引号终止):

    s"""select ${if (isF) "file" else "folder"} "${abs.getName}" of folder"""
    

    【讨论】:

    • 我也发现这是错误SI-6476。三引号的缺点是,当字符串以引号结尾时,IntelliJ IDEA 会出现中断,例如"""foo""""。妈的……
    • 嘿,如果这是你对 IntelliJ IDEA 最糟糕的批评,那么它已经走了很长一段路......
    • 别误会,我喜欢 IDEA,只是因为它是一个单独的编译器,它永远不会 100% 遵守规范,无论你有哪个插件更新,总有亮点某处的错误...
    • 我认为 Eclipse IDE 正在获得一个用于插值的快速修复转换器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多