2014-09-02 9 views

Antwort

41

Mit Blick auf die Quelle für die Standardinterpolatoren (hier gefunden: https://github.com/scala/scala/blob/2.11.x/src/library/scala/StringContext.scala) sieht es so aus, als ob der "rohe" Interpolator die Identitätsfunktion für jeden Buchstaben aufruft, also was Sie herausgeben. Der größte Unterschied, den Sie finden werden, besteht darin, dass der Rohinterpolator immer noch nicht funktioniert, wenn Sie in Ihrer Quelle ein Zeichenfolgeliteral angeben, das das Anführungszeichen enthält. das heißt Sie können nicht sagen

raw"this whole "thing" should be one string object" 

aber kann man sagen

"""this whole "thing" should be one string object""" 

So könnte man sich fragen, „ich jemals den rohen Interpolator Warum sollte dann die Mühe mit?“ und die Antwort ist, dass der Rohinterpolator immer noch Variablensubstitution durchführt. So

val helloVar = "hello" 
val helloWorldString = raw"""$helloVar, "World"!\n""" 

geben Sie die Zeichenfolge „Hallo‚Welt‘! \ N“ mit dem \ n nicht zu einem Newline umgewandelt werden, und die Anführungszeichen um das Wort Welt.

+0

Danke, vermisste ich das Teil in docs, wo es heißt, dass es auch Interpolation der Fall ist. – ntn

+0

Für die Aufzeichnung sagt das Scaladoc tatsächlich, was es tut. http://www.scala-lang.org/files/archive/nightly/2.11.x/api/2.11.x/index.html#[email protected](args:Any*):String –

+0

Im Grunde sagen Sie das 'rohe' macht was' s'. Ich kann '" "" $ Literal String mit Substitution "" "'. Dies erklärt sowieso nicht die Notwendigkeit von "row". –

11

Es ist überraschend, dass das s-Interpolator entkommt wieder einschaltet, auch bei Verwendung von Triple-Zitaten:

scala> "hi\nthere." 
res5: String = 
hi 
there. 

scala> """hi\nthere.""" 
res6: String = hi\nthere. 

scala> s"""hi\nthere.""" 
res7: String = 
hi 
there. 

Das s-Interpolator nicht weiß, dass es String-Teile bearbeitet, die ursprünglich dreifach zitierten waren . Daraus folgt:

scala> raw"""hi\nthere.""" 
res8: String = hi\nthere. 

Dies ist wichtig, wenn Sie verwenden Schrägstriche auf andere Weise, wie reguläre Ausdrücke:

scala> val n = """\d""" 
n: String = \d 

scala> s"$n".r 
res9: scala.util.matching.Regex = \d 

scala> s"\d".r 
scala.StringContext$InvalidEscapeException: invalid escape character at index 0 in "\d" 
    at scala.StringContext$.loop$1(StringContext.scala:231) 
    at scala.StringContext$.replace$1(StringContext.scala:241) 
    at scala.StringContext$.treatEscapes0(StringContext.scala:245) 
    at scala.StringContext$.treatEscapes(StringContext.scala:190) 
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94) 
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94) 
    at scala.StringContext.standardInterpolator(StringContext.scala:124) 
    at scala.StringContext.s(StringContext.scala:94) 
    ... 33 elided 

scala> s"""\d""".r 
scala.StringContext$InvalidEscapeException: invalid escape character at index 0 in "\d" 
    at scala.StringContext$.loop$1(StringContext.scala:231) 
    at scala.StringContext$.replace$1(StringContext.scala:241) 
    at scala.StringContext$.treatEscapes0(StringContext.scala:245) 
    at scala.StringContext$.treatEscapes(StringContext.scala:190) 
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94) 
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94) 
    at scala.StringContext.standardInterpolator(StringContext.scala:124) 
    at scala.StringContext.s(StringContext.scala:94) 
    ... 33 elided 

scala> raw"""\d$n""".r 
res12: scala.util.matching.Regex = \d\d 
+0

Das ist in der Tat seltsam, und nicht das, was ich angenommen hätte. Danke, dass du es aufgezeigt hast. – TOB

Verwandte Themen