2015-10-07 4 views
13

Escaping Wenn ich $ mehrzeilige Zeichenfolgen verwenden möchte, wie kann ich es entkommen? Vorlagen in Kotlin Multiline-Strings

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

$eq wird als Referenz auf eine Variable syntaktisch analysiert. Wie kann man $ umgehen, so dass es nicht als Referenz auf Variable erkannt wird? (Kotlin M13)

+0

Ähnliche: http://stackoverflow.com/questions/33461403/escape-something-in-a-kotlin-string – Vadzim

Antwort

15

Aus der Dokumentation

Eine rohe Zeichenfolge durch eine dreifache Quote begrenzt wird ("" "), enthält keine Flucht und Zeilenumbrüche und andere Zeichen

enthalten Sie müssten mit Zeilenumbrüchen eine Standardzeichenfolge verwenden

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

oder Sie könnten die wörtliche Darstellung verwenden

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

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

+7

Schade, es gibt keine Möglichkeit, $ in rohen Strings zu entkommen ... bei der Verwendung der Single-Line-Syntax ist es ein bisschen hässlich und nicht lesbar ... Wenn sie nur etwas wie "wirklich rohe und dumme Zeichenkette" hätten, würde alles einschließlich ignorieren $ templates ... – ntoskrnl

+0

ja, wie singlequote: 'aaa $ {bbb}' oder '' 'sssssssss' '' ' – momomo

4

Komisch, aber das funktioniert:

val eq = "\$eq" 

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

Eigentlich, wenn eq eine Zahl (ein Preis oder sth), dann möchten Sie wahrscheinlich separat berechnen und eine zusätzliche externe Berechnung, wie ich es vorgeschlagen habe, wird nicht schaden.

+1

$ eq hier wird als Variable erkannt, die ich nicht will. Ich möchte, dass die Syntax ignoriert wird. – ntoskrnl

+1

Für mich wäre das ein Workaround, sicherlich ist die Syntax besser als '.. $ {'$} eq..'' Sehen Sie selbst, obwohl – voddan

+1

abgesehen von $ eq, wird es $ lt, $ lte, $ gt, $ gt, $ length und viele mehr ... – ntoskrnl

0

Wenn Sie im Voraus wissen, welche $ -Variablen Sie möchten (wie bei der Abfrage von Mongo, wie es aussieht), können Sie ein kleines Hilfsobjekt erstellen, das diese Variablen definiert. Sie erhalten auch einen gewissen Schutz vor versehentlichen Schreibfehlern eines Ihrer Operatoren, was ordentlich ist.

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

Ich schrieb einfache Versionen für die Aktualisierung und Abfrage-Strings für Mongo hier: https://gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15