2014-03-28 5 views
6

Ich bekomme einen seltsamen Fehler mit dem folgenden Code.Seltsame Fehler mit String-Interpolation

Ich habe eine Klasse Example, mit einem Begleiter Objekt, in dem ich einen String definiert haben, SIGN. In Klasse Example Ich habe eine Methode dort ich einen regulären Ausdruck erstellen, und ich verwende String-Interpolation, so dass ich SIGN verwenden kann, um meinen regulären Ausdruck zu erstellen.

Dies kompiliert, aber ich bekomme einen seltsamen Fehler zur Laufzeit. Ist das ein Scala-Bug? Ich benutze Scala 2.10.3 (unter Windows 7).

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class Example { 
    import Example._ 
    def regex = s"""$SIGN?\d+""".r 
} 

object Example { 
    private val SIGN = """(\+|-)""" 
} 


// Exiting paste mode, now interpreting. 

defined class Example 
defined module Example 

scala> val e = new Example 
e: Example = [email protected] 

scala> e.regex 
scala.StringContext$InvalidEscapeException: invalid escape character at index 1 in "?\d+" 
     at scala.StringContext$.treatEscapes(StringContext.scala:229) 
     at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90) 
     at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90) 
     at scala.StringContext.standardInterpolator(StringContext.scala:123) 
     at scala.StringContext.s(StringContext.scala:90) 
     at Example.regex(<console>:9) 
+0

@ raina77ow Das funktioniert auch nicht, ich bekomme die gleiche Ausnahme. – Jesper

+2

Es sieht so aus, als ob Sie eine Version von [this issue] (https://issues.scala-lang.org/browse/SI-6476) sehen, vielleicht? Plain old 's" $ SIGN? \\ d + ". R' sollte gut funktionieren. –

+0

Ja, es funktioniert mit '\\\'. – raina77ow

Antwort

6

Nachdem ich die Stapelspur sorgfältig betrachtet habe, sehe ich, was passiert.

Sie können sehen, dass die Methode s auf der Zeichenfolge ausgeführt wird, die den Austausch von $SIGN übernimmt. Diese Methode stößt auf die \d in der Zeichenfolge und versucht anscheinend, dies zu übersetzen; Siehe den Aufruf von treatEscapes in der Stack-Trace. Die treatEscapes Methode erkennt \d nicht und löst eine Ausnahme aus.

Es kann durch das Schreiben \\d in der Zeichenfolge festgelegt werden, sondern dass Niederlagen den ganzen Zwecks eine Triple-Zeichenfolge in Anführungszeichen mit ...

Fazit: Es scheint, wie String-Interpolation und Triple-Strings in Anführungszeichen mit jedem einmischen andere. Ich würde sagen, das ist ein Scala-Bug. (Warum behandelt die s Methode Escapes?).

bearbeiten - Das sieht tatsächlich wie Bug SI-6476 wie Travis Brown in einem Kommentar darauf hingewiesen.

+0

Wäre nett, dem Scala Projekt eine bessere Fehlermeldung zu schicken (brauchte nur 1 Stunde, um diesen kleinen dämlichen Bug zu finden). die Nachricht würde die Problemumgehung geben, nicht die beste Sache überhaupt, aber würde helfen ... – pommedeterresautee

+0

Der Code wird berührt, also würde jetzt eine gute Zeit sein, einen Vorschlag zu machen. Aber es ist ziemlich schwierig, die Problemumgehung zu erraten. Vielleicht ein ausführlicher Modus, um die normalen Strings zu zeigen. https://github.com/scala/scala/pull/3695 –

+0

@pommedeterresautee siehe meinen vorherigen Kommentar. Auch SI-6476 ist das gegenteilige Problem, Leute, die sich darüber beschweren, dass ein entgangenes Zitat nicht für gewöhnliche s unterstützt wird. Ich schätze, du willst für wirklich grundlegende Sachen entkommen, s "" "$ a \ n $ b" "". Odersky sagte, was für ein klarer Gewinn das Feature sei, trotz seiner Zweifel, und doch sind die Leute durch alle möglichen Randfälle verärgert. –