Scala

2014-09-02 5 views
25

Scala'da ham dize enterpolasyonu ve üçlü tırnak işaretleri arasındaki fark nedir? Kaçış olmadan dizede özel karakterleri kullanmak için üçlü alıntı dizeleri """String\nString""" vardır. Scala 2.10 da aynı amaçla raw"String\nString" ekledi.Scala

raw"" ve """""" nasıl çalışır? Aynı dizi için farklı çıktılar üretebilirler mi?

cevap

41

Varsayılan enterpolatörler için kaynağa bakıldığında (burada bulunan: https://github.com/scala/scala/blob/2.11.x/src/library/scala/StringContext.scala) "ham" yorumlayıcı her harf üzerindeki kimlik işlevini çağırır gibi görünüyor, bu yüzden ne koyacağınız dışarı koyarsınız. Bulmanız gereken en büyük fark, alıntı karakterini içeren kaynağınızda bir dize değişmezi sağlamanız durumunda, ham interpolator hala çalışmayacaktır. yani oturum

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

diyemem ama merak olabilir

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

diyebilirsiniz "Neden ben hiç o çiğ aradeğerleyici kullanarak rahatsız olur?" ve cevap, ham interpolator hala değişken ikame gerçekleştirir. Yani

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

size dize verecek "merhaba 'Dünya'! \ N \" n değil bir yeni satır dönüştürülür ve kelime dünya çapında tırnak ediliyor.

+0

Teşekkür ben docs yer kaçırdı. – ntn

+0

Kayıt için, scaladoc aslında ne yaptığını söylüyor. http://www.scala-lang.org/files/archive/nightly/2.11.x/api/2.11.x/index.html#[email protected](args:Any*):String –

+0

Temelde Bu ham 'ne yapar' yapar. "" "$ Ile" $ "dizesini değiştirebilirim. Bu zaten 'sıra' ihtiyacını açıklamıyor. –

11

O s-aradeğerleyici kullanarak üç çift tırnak kullanırken bile, geri kaçar döner şaşırtıcıdır:

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

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

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

olarak s-interpolator özgün-üçlü alıntı vardı dize parçaları işleminin aslı olduğunu bilmiyor . Dolayısıyla:

Böyle regexes gibi diğer yollarla tersbölüleri kullanırken bu önemlidir
scala> raw"""hi\nthere.""" 
res8: String = hi\nthere. 

: o da interpolasyon yapar yazan yere

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

Bu gerçekten garip, ve ben de böyle bir durumda olduğumu düşünmemiştim. İşaret ettiğin için teşekkürler. – TOB