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 编译器库中没有“scala-library*.jar”

尝试执行编译任务但无法加载神秘模块

如何在 Scala 中表示一个空字符?

在 Eclipse IDE 中使用 Scala 代码。内部编译器错误

编译 Play 框架测试时出现错误“scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler m