web-dev-qa-db-ja.com

Kotlinの複数行文字列でエスケープするテンプレート

複数行の文字列で$サインを使用したい場合、どうすればエスケープできますか?

val condition = """ ... $eq ... """

$eqは、変数への参照として解析されます。変数への参照として認識されないように、$をエスケープする方法は? (コトリンM13)

29
ntoskrnl

ドキュメントから

生の文字列は、三重引用符( "" ")で区切られ、エスケープを含まず、改行やその他の文字を含めることができます

改行付きの標準文字列を使用する必要があります

" ...\n \$eq \n ... "

または、リテラル表現を使用できます

""" ... ${'$'}eq ... "

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

42
Jeremy Lyman

おかしいが、それはうまくいく:

val eq = "\$eq"

print("""... $eq  ..."""")   // just like you asked :D

実際、eqが数値(価格、またはsth)である場合、おそらく個別に計算する必要がありますが、追加の外部計算は問題ありません。

6
voddan

事前に知っている場合$-必要な変数(Mongoを照会するときなど、実行しているように見える場合)で、これらの変数を定義する小さなヘルパーオブジェクトを作成できます。また、オペレーターの1つを誤ってスペルミスから保護することもできます。

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の更新とクエリ文字列の簡単なバージョンを書きました: https://Gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15

3
Yona Appletree