web-dev-qa-db-fra.com

Modèles s'échappant dans les chaînes multilignes Kotlin

Si je veux utiliser le signe $ dans des chaînes multilignes, comment puis-je y échapper?

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

$eq est analysé comme une référence à une variable. Comment échapper à $, pour qu'il ne soit pas reconnu comme référence à une variable? (Kotlin M13)

20
ntoskrnl

De la documentation

Une chaîne brute est délimitée par un guillemet triple ("" "), ne contient pas D'échappement et peut contenir des nouvelles lignes et tout autre caractère.

Vous devez utiliser une chaîne standard avec des nouvelles lignes.

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

ou vous pouvez utiliser la représentation littérale 

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

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

29
Jeremy Lyman

C'est marrant, mais ça marche:

val eq = "\$eq"

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

En fait, si eq est un nombre (un prix, ou qch), alors vous voudrez probablement le calculer séparément, et un calcul externe supplémentaire, comme je l’ai suggéré, ne fera pas de mal. 

4
voddan

Si vous savez à l'avance quelles sont les variables $- que vous souhaitez (par exemple, lorsque vous interrogez Mongo, vous pouvez le faire), vous pouvez créer un petit objet d'assistance définissant ces variables. Vous bénéficiez également d'une certaine protection contre les fautes d'orthographe accidentelles de l'un de vos opérateurs, ce qui est pratique.

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

J'ai écrit des versions simples pour les chaînes de mise à jour et de requête pour Mongo ici: https://Gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15

0
Yona Appletree