String Kotlin多行字符串中的模板转义
如果我想使用String Kotlin多行字符串中的模板转义,string,kotlin,syntax,String,Kotlin,Syntax,如果我想使用$登录多行字符串,如何对其进行转义? $eq被解析为变量的引用。如何转义$,使其不会被识别为变量的引用?(Kotlin M13)来自 原始字符串由三个引号(“”)分隔,不包含 转义和可以包含换行符和任何其他字符 您需要将标准字符串与换行符一起使用 " ...\n \$eq \n ... " 或者您可以使用文字表示法 """ ... ${'$'}eq ... " 很有趣,但这很有效: val eq = "\$eq" print("""... $eq ..."""") //
$
登录多行字符串,如何对其进行转义?
$eq
被解析为变量的引用。如何转义$
,使其不会被识别为变量的引用?(Kotlin M13)来自
原始字符串由三个引号(“”)分隔,不包含
转义和可以包含换行符和任何其他字符
您需要将标准字符串与换行符一起使用
" ...\n \$eq \n ... "
或者您可以使用文字表示法
""" ... ${'$'}eq ... "
很有趣,但这很有效:
val eq = "\$eq"
print("""... $eq ..."""") // just like you asked :D
实际上,如果
eq
是一个数字(一个价格或其他),那么您可能需要单独计算它,并且按照我的建议进行额外的外部计算不会有任何影响。如果您提前知道所需的$
-变量(比如在查询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}}""" }
}
我在这里为mongo编写了更新和查询字符串的简单版本:太糟糕了,没有办法在原始字符串中转义$。当使用单行语法时,它有点难看而且不可读…如果它们有“真正的原始和哑字符串”之类的东西,它会忽略所有内容,包括$模板…是的,比如单引号:'aaa${bbb}'或''sssss''
\$
在多行字符串中不起作用。只有${'$'}
起作用。因为反斜杠被解释为文字反斜杠而不是转义符。因此groovy有三重单引号,不插值,希望kotlin支持这一点。这两个变体“x”
和“x”“
是字符串文字。我建议将“或者您可以使用文字表示法”改为“或者您可以使用原始字符串”$eq被认为是我不想要的变量。我希望所有语法都被忽略。对我来说,这将是一个解决办法,当然语法比“..${$}eq..”好,你自己看看,虽然我在下面的回答中提到过,你可以用一个helper对象使它更简洁,但真正酷的是你可以定义你允许的$
-字符串集,在一组已定义的运算符(如Mongo)的情况下,这意味着您获得了一些打字保护。类似:sed's/\$/${'''''$'''''''''}/g'
(以防那些Kotlin字符串文字是由其他内容自动生成的),因为$在原始字符串中已经是神奇的,并且必须注意它后面是否有{}或变量名,有点遗憾的是,他们并没有简单地让$自行消失:$$将变成$,如果您想在$price之前获得$,您可以写“$$$price”
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}}""" }
}