2017-08-02 66 views
9

我試圖做斯卡拉接下來,我使用play2:Json.obj Scala中,字符串連接:編譯錯誤

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" 
      ))) 

,但它給我的錯誤:

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

但如果我這樣做:

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

它編譯和作品...

我怎樣才能以str1 + str2 + str3的形式編寫它更具可讀性?這裏的順序/優先順序如何?在我的回答中,我不明白爲什麼()不需要評論。是否還有另一個類似的情況需要括號?

PS:我不知道,如果在Java中是同一個問題

回答

6

這是很容易通過觀察運算符優先級解釋。

從語言參考http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#infix-operations,我們可以看到,運營商+->具有相同的優先級。這是因爲,一般來說,它是確定其優先級的運算符的第一個字符。在我們的例子中,第一個字符是+-,它們都具有相同的優先級。

因此,寫入"code" -> "this mode " + str + " does not exist"是一樣的文字:

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

這是什麼,編譯器會告訴你是一致的:

  • 第一操作的結果類型("code" -> "this mode ")被(String, String)其相當於Tuple2[String, String]
  • (String, String) + String觸發元組上的隱式toString()轉換,因此th e生成類型爲String

您似乎已經找到更好的方式來以更可讀的方式對其進行格式化。

至於其他情況是括號是必要的,顯而易見的答案是,只要你不需要運算符優先級給你的行爲,你就需要它們。因此,我強烈建議閱讀上面鏈接的規範章節6.12!

+0

非常感謝它federic!真的很好回答:),當然我會接受 –

-2

您可以在地圖上StringSeq[String]創建你的錯誤信息,然後將它們轉換成JSON。我認爲這將是最好的辦法。

+0

這不是我所問:D –

1

最後我能做到這一點,但我不知道原因,我認識的人,請讓我知道:

我的憂愁與(琴絃),它編譯和作品就像一個魅力:

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

一起這將是:

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

這顯然是操作員應用程序的順序/優先 – cchantep

+0

@cchantep我做了一個更新的答案,如果你想再看看它 –