2017-08-02 8 views
9

私はScalaで次をやろうとしている、私はPLAY2使用しています:Json.objスカラ、文字列連結:コンパイルエラー

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であなたがStringSeq[String]のマップで自分のエラーメッセージを作成し、JSON形式にそれらを変換することができ、同じ問題

答えて

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()変換をトリガーします。結果の型はStringです。

あなたはすでに読みやすい方法でより良いフォーマットを見つけたようです。

他のケースでは、かっこが必要ですが、明らかな答えは、オペレータの優先順位があなたに与える行動を望まないとすぐに必要になることです。このように私は上記のスペックの6.12章を読むことを強くお勧めします!

+0

感謝を見てみたい場合は!本当に素晴らしい答え:)確かに私は受け入れるだろう –

-2

であるかはわかりません。私はそれがそれを行う最良の方法だと思います。

+0

私は尋ねないことを:明らかにオペレータの適用順序/優先私は答えに更新を行っ –

1

は最後に、私はそれを行うことができますが、私はその理由を知らない、私は誰かが知っている、私に知らせてください。

私は()で文字列をsorrowed、それがコンパイルされ、魔法のように動作:

"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

、あなたはそれでそれがfedericのために多くを再び – cchantep

+0

@cchantepだD –