模板在Kotlin多行字符串中转义

nto*_*rnl 33 string syntax kotlin

如果我想使用$登录多行字符串,我该如何逃避呢?

val condition = """ ... $eq ... """
Run Code Online (Sandbox Code Playgroud)

$eq被解析为对变量的引用.如何逃避$,以便它不会被识别为变量的引用?(Kotlin M13)

Jer*_*man 46

从文档中

原始字符串由三引号(""")分隔,不包含转义,可以包含换行符和任何其他字符

您需要使用带换行符的标准字符串

" ...\n \$eq \n ... "
Run Code Online (Sandbox Code Playgroud)

或者您可以使用文字表示

""" ... ${'$'}eq ... "
Run Code Online (Sandbox Code Playgroud)

s:http://kotlinlang.org/docs/reference/basic-types.html#string-literals

  • 太糟糕了没有办法在原始字符串中转义$ ...当使用单行语法时,它有点难看且不可读......如果只有它们有"真正原始和愚蠢的字符串"之类的东西,它会忽略包括$ templates ... (10认同)
  • `\$` 在多行字符串中 **not** 工作。只有`${'$'}` 可以。因为反斜杠被解释为文字反斜杠而不是转义符。 (5认同)
  • 所以groovy有三重单引号,http://groovy-lang.org/syntax.html#_triple_single_quoted_string,它不插值,希望kotlin支持这个。 (2认同)

vod*_*dan 8

有趣,但是可行:

val eq = "\$eq"

print("""... $eq  ..."""")   // just like you asked :D
Run Code Online (Sandbox Code Playgroud)

实际上,如果eq是一个数字(一个价格或某物),那么您可能要单独计算它,并且我建议的其他外部计算不会受到影响。

  • 这里的 $eq 被识别为我不想要的变量。我希望忽略所有语法。 (3认同)
  • 对我来说,这将是一种解决方法,当然语法比`..${'$}eq..`` 自己看,虽然 (2认同)

Yon*_*ree 5

如果你提前知道$你想要什么-variables(比如在查询 Mongo 时,看起来你可能正在做),你可以创建一个定义这些变量的小助手对象。您还可以获得一些保护,防止意外拼错您的操作员之一,这很整洁。

object MongoString {
    inline operator fun invoke(callback: MongoString.() -> String) = callback()

    val eq = "\$eq"
    val lt = "\$lt"
    // ... and all the other operators ...
}

fun test() {
    val query = MongoString { """{"foo": {$lt: 10}}""" }
}
Run Code Online (Sandbox Code Playgroud)

我在这里为 mongo 编写了简单版本的更新和查询字符串:https : //gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15