Шаблоны, выходящие в многострочные строки Котлина

Если я хочу использовать знак $ в многострочных строках, как мне его избежать?

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

$eq анализируется как ссылка на переменную. Как избежать $, чтобы он не был распознан как ссылка на переменную? (Kotlin M13)

Ответ 1

Из документации

Необработанная строка разделяется тройной цитатой ( "" ), не содержит экранирование и может содержать символы новой строки и любой другой символ

Вам понадобится использовать стандартную строку с символами новой строки

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

или вы можете использовать литеральное представление

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

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

Ответ 2

Смешно, но это работает:

val eq = "\$eq"

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

Собственно, если eq - число (цена или sth), то вы, вероятно, захотите рассчитать его отдельно, а дополнительный внешний расчет, как я предложил, не повредит.

Ответ 3

В случае, когда вы знаете заранее, что $ -переменные, которые вы хотите (например, при запросе 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 здесь: https://gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15