我试图在Scala中尝试下一个,我使用的是play2:
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中是否存在同样的问题
答案 0 :(得分:5)
通过查看运算符优先级可以很容易地解释这一点。
从语言参考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章!
答案 1 :(得分: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"
))))
答案 2 :(得分:-2)
您可以在String
和Seq[String]
的地图中创建错误消息,然后将其转换为Json。我认为这是最好的方法。