2015-10-07 7 views
13

Jeśli chcę użyć znaku wielowierszowego $, w jaki sposób mogę go uciec? Szablony wychodzące z łańcuchów wieloliniowych Kotlin

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

$eq jest analizowany w odniesieniu do zmiennej. Jak uciec $, aby nie został rozpoznany jako odniesienie do zmiennej? (Kotlin M13)

+0

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

Odpowiedz

15

Z dokumentacji

A surowego ciąg jest ograniczony przez potrójną cudzysłów ("" "), nie zawiera ucieczki i może zawierać znaki nowej linii i dowolny inny znak

trzeba by użyć standardowego ciąg z nowymi liniami

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

lub można użyć dosłowne przedstawienie

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

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

+7

Szkoda, że ​​nie ma sposobu na uniknięcie $ w surowych ciągach ... kiedy używa się składni pojedynczej linii, jest to trochę brzydkie i nieczytelne ... Gdyby mieli coś w rodzaju "naprawdę surowego i niemądrego sznurka", co zignorowałoby wszystko, łącznie z $ templates ... – ntoskrnl

+0

tak, jak w przypadku pojedynczej aukcji: 'aaa $ {bbb}' lub '' 'sssssssss' '' – momomo

4

zabawny, ale to działa:

val eq = "\$eq" 

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

Właściwie, jeśli eq jest liczbą (cena, lub czegoś), to prawdopodobnie chcesz, aby obliczyć oddzielnie , a dodatkowe obliczenia zewnętrzne, jak sugerowałem, nie zaszkodzą.

+1

$ eq tutaj jest rozpoznawana jako zmienna, której nie chcę. Chcę, aby ignorować całą składnię. – ntoskrnl

+1

Dla mnie byłoby to obejściem, z pewnością składnia jest lepsza niż '.. $ {'$} eq..'' Zobacz sam, chociaż – voddan

+1

oprócz $ eq, będzie $ lt, $ lte, $ gt, $ gt, $ length i wiele więcej ... – ntoskrnl

0

W przypadku, gdy wiesz z wyprzedzeniem, jakie są wymagane zmienne (np. Podczas wysyłania zapytania do Mongo, jak się wydaje), możesz utworzyć mały obiekt pomocnika, który definiuje te zmienne. Otrzymujesz również ochronę przed przypadkowym błędnym pisaniem jednego z twoich operatorów, co jest miłe.

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

napisałem proste wersje aktualizacji i kwerendy ciągów dla Mongo tutaj: https://gist.github.com/Yona-Appletree/29be816ca74a0d93cdf9e6f5e23dda15

Powiązane problemy