2014-03-28 129 views
6

我得到一個奇怪的錯誤,下面的代碼。字符串插值奇怪的錯誤

我有一個類Example,有一個伴侶對象,其中我定義了一個字符串SIGN。在類Example我有一個方法,我創建一個正則表達式,我使用字符串插值,以便我可以使用SIGN來建立我的正則表達式。

這編譯,但我在運行時得到一個奇怪的錯誤。這是一個斯卡拉錯誤?我正在使用Scala 2.10.3(在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這也行不通,我得到同樣的例外。 – Jesper

+2

看起來你看到[本期]的某個版本(https://issues.scala-lang.org/browse/SI-6476),也許?簡單的舊的「$ SIGN?\\ d +」。r'應該可以正常工作。 –

+0

是的,它適用於\\\'。 – raina77ow

回答

6

仔細查看堆棧跟蹤後,我看到發生了什麼。

您可以看到方法s在字符串上執行,該字符串處理$SIGN的替換。該方法遇到字符串中的\d,顯然試圖翻譯這個;請參閱堆棧跟蹤中對treatEscapes的調用。 treatEscapes方法不識別\d並引發異常。

它可以通過在字符串中寫\\d是固定的,但違背了三引號字符串的整個目的...

結論:這似乎是字符串插值和三引號字符串井水不犯河水其他。我會說這是一個斯卡拉錯誤。 (爲什麼s方法會處理轉義?)。

編輯 - Travis Brown在評論中指出,這確實看起來像bug SI-6476

+0

很高興向Scala項目提交一個更好的錯誤信息(花了1個小時才找到這個小笨蛋)。該消息將給出解決方法,而不是有史以來最好的事情,但會有所幫助... – pommedeterresautee

+0

代碼越來越感動了,所以現在應該是提出建議的好時機。但是很難猜測解決方法。也許一個詳細的模式來顯示正常的字符串轉義。 https://github.com/scala/scala/pull/3695 –

+0

@pommedeterresautee看到我的prev評論。另外,SI-6476是相反的問題,人們抱怨說普通的s不支持逃脫的報價。「我猜你想逃避真正的基本的東西,s「」「$ a \ n $ b」「」。奧德斯基說,儘管他有疑問,但這個特徵明顯勝出,然而人們卻對各種邊緣案例感到厭惡。 –

相關問題