Json.obj Scala,字符串连接:编译错误
Posted
技术标签:
【中文标题】Json.obj Scala,字符串连接:编译错误【英文标题】:Json.obj Scala, string concat: Compilation error 【发布时间】:2018-01-09 22:41:48 【问题描述】:我正在尝试在 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 中是否是同样的问题
【问题讨论】:
【参考方案1】:这很容易通过查看运算符优先级来解释。
从语言参考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 章!
【讨论】:
非常感谢 Federic!真的很棒的答案:),我肯定会接受【参考方案2】:我终于可以做到了,但我不知道原因,我有人知道,请告诉我:
我用 () 对字符串感到悲伤,它编译并像魅力一样工作:
"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"
))))
【讨论】:
这显然是算子申请顺序/优先级 @cchantep 我更新了答案,如果你想再看一遍【参考方案3】:您可以在 <code>String</code>
和 <code>Seq[String]</code>
的映射中创建错误消息,然后将它们转换为 Json。我认为这是最好的方法。
【讨论】:
这不是我问的:D以上是关于Json.obj Scala,字符串连接:编译错误的主要内容,如果未能解决你的问题,请参考以下文章
错误:scala:Scala 编译器库中没有“scala-library*.jar”
在 Eclipse IDE 中使用 Scala 代码。内部编译器错误
编译 Play 框架测试时出现错误“scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler m