2017-08-02 20 views
9

ben Scala sonraki yapmaya çalışıyorum, ben kullanıyorum play2:Json.obj Scala, dize concat: Derleme hatası

val str = "another" 
val r = Json.obj("error_type" -> "invalid_request_error", 
      "validation_errors" -> (Json.obj(
       "code" -> "this mode " + str + " does not exist", 
       "param" -> "mode" 
      ))) 

ama bana hata veriyor:

Type mismatch, expected: (String, Json.JsValueWrapper), actual: String 

ama bunu yaparsam:

val r = Json.obj("error_type" -> "invalid_request_error", 
      "validation_errors" -> (Json.obj(
       ("this mode ".+(str)).+(" does not exist"), 
       "param" -> "mode" 
      )))) 

Bu derlemek ve çalışır ...

Nasıl str1 + str2 + str3 biçiminde daha okunabilir yazabilirim? Buradaki emir/öncelik nasıldır? Cevabımda, neden() ne yoruma ihtiyaç duyduğunu anlamıyorum. Parantez gerektiğinde başka benzer bir durum var mı?

ps: Java Sen String ve Seq[String] haritasında hata mesajlarınızı oluşturmak ve daha sonra Json dönüştürüp aynı sorunu

cevap

6

Bu kolayca operatör önceliği bakarak açıklanabilir.

dil referans http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#infix-operations itibaren

, biz + ve -> operatörleri aynı önceliğe sahip olduğunu görebiliriz. Bunun nedeni, genel olarak, önceliğini belirleyen bir operatörün ilk karakteri olmasıdır. Bizim örneğimizde, ilk karakterler, her ikisi de aynı önceliğe sahip olan + ve -'dur.

"code" 
    .->("this mode ") 
    .+(str) 
    .+(" does not exist") 

Bu derleyici ne söyler ile tutarlıdır:

böylece "code" -> "this mode " + str + " does not exist" yazma yazma aynıdır

  • ilk işlemin sonucu tipi ("code" -> "this mode ") (String, String) olan Bu nedenle, th
  • (String, String) + String başlığın örtülü bir toString() dönüşüm tetikler Tuple2[String, String] eşdeğerdir e sonuç türü String'dur.

Daha okunabilir bir şekilde biçimlendirmenin daha iyi bir yolunu zaten bulmuş görünüyorsunuz. Diğer durumlarda gelince

parantez ihtiyaç vardır edildi açık cevap size davranış operatör önceliği size vereceğini neyi istemiyoruz en kısa sürede onlara ihtiyacım olurdu. Bu nedenle, yukarıda belirtilen spesifikasyonun 6.12 bölümünü okumanızı tavsiye ederim!

+0

sayesinde bakmak isterseniz! gerçekten harika cevap :), kabul edeceğim elbette –

-2

olup olmadığından emin değilim. Bunu yapmanın en iyi yolu olacağını düşünüyorum.

I (dizelerle sorrowed) ve derlenmiş ve bir cazibe gibi çalışır:

+0

sordum bu değil Yani: Açıkçası operatör uygulama sırası/öncelik ben cevap için bir güncelleme yapılmış –

1

Sonunda bunu yapabileceğimi, ama ben nedenini bilmiyorum, birisi biliyorum lütfen bana bildirin

"code" -> ("payment mode " + another + " does not exist"), ... 

hep birlikte olacağını:

Json.obj("error_type" -> "invalid_request_error", 
         "validation_errors" -> (Json.obj(
         "code" -> ("payment mode " + another + " does not exist"), 
         "param" -> "payment_mode" 
        )))) 
+0

, ona o Federic için çok tekrar – cchantep

+0

@cchantep var D –