to pytanie jest nieco stary, ale potknął się o niego podczas poszukiwania rozwiązania siebie i był niezadowolony z innych odpowiedzi, ponieważ nie są one bezpieczne (zastępując rzeczy samodzielnie) lub wymagają zewnętrznej biblioteki.
Znalazłem sposób, aby uzyskać reprezentację escaped ciągu znaków z biblioteką standardową scala (> 2.10.0), która jest bezpieczna. Wykorzystuje małą sztuczkę:
Poprzez odbicie w czasie wykonywania można łatwo uzyskać reprezentację dosłownego wyrażenia ciągu. Drzewo takiego wyrażenia jest zwracane jako (prawie) kod scala, gdy wywołuje się metodę toString
. Oznacza to w szczególności, że literał jest reprezentowany tak, jak w kodzie, tzn. Jest unikany i podwójnie cytowany.
def escape(raw: String): String = {
import scala.reflect.runtime.universe._
Literal(Constant(raw)).toString
}
Funkcja escape
powoduje zatem żądany kod reprezentacji dostarczonego surowca łańcucha (w tym otaczających cudzysłowach)
scala> "\bHallo" + '\n' + "\tWelt"
res1: String =
?Hallo
Welt
scala> escape("\bHallo" + '\n' + "\tWelt")
res2: String = "\bHallo\n\tWelt"
Rozwiązanie to jest wprawdzie nadużywanie API odbicia, ale IMHO bezpieczniejsza i łatwiejsze do utrzymania niż inne proponowane rozwiązania.
Czy wiesz, jak korzystać z funkcji unescape przy odbiciu? – Renkai
@Renkai nie potrzebujesz do tego refleksji. Możesz użyć StringContext: 'StringContext.treatEscapes (res2)'. Pozostawia podwójny cudzysłów chociaż –
'StringContext.treatEscapes' działa odwrotnie: konwertuje" \\ t "na" \ t ". –