Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Kotlin多行字符串中的模板转义_String_Kotlin_Syntax - Fatal编程技术网

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}}""" }
}