方法 returns 单位而不是 scala 中的字符串

Method returns unit instead of string in scala

我试图从 Scala 中的 Set 类型中获取字符串。但是,无论我尝试什么,它都是 returning Unit 作为 return 类型而不是 string.

if (!validationMessages.isEmpty) {
      dataTuple = (parsedJson.toString(), for (s <- validationMessages.toString()){
        s.toString()
      })
      println(dataTuple)
    }
    else {
      dataTuple = (parsedJson.toString(), "some string...")
    }  

基本上,我正在尝试 return 像 (String, String) 这样的元组。我错过了什么?

块的值是块中最后一个表达式的值。在这种情况下 if 部分的值是

println(dataTuple)

else部分的值为

dataTuple = (parsedJson.toString(), "some string...")

这两个表达式 return Unit 所以结果是 Unit.

快速修复是使 dataTuple 每个分支中的最后一个语句:

if (!validationMessages.isEmpty) {
      dataTuple = (parsedJson.toString(), for (s <- validationMessages.toString()){
        s.toString()
      })
      println(dataTuple)
      dataTuple
    } else {
      dataTuple = (parsedJson.toString(), "some string...")

      dataTuple
    } 

但也可以考虑像这样的更简单的解决方案:

val msg = 
    if (validationMessages.nonEmpty) {
       validationMessages.mkString(", ")
    } else {
       "some string"
    }
(parsedJson.toString, msg)

mkString 是尝试替换此代码:

for (s <- validationMessages.toString()) {
  s.toString()
}

此代码似乎试图通过组合所有验证消息来创建一个字符串,但它实际上 returns Unit 因为 for 没有 [=23] =]. mkStringSet 的每个元素上调用 toString,然后通过在每个元素之间放置“,”来创建一个字符串。这似乎是大致想要的,应该很容易修改到实际需求。

为什么代码会这样?

该代码具有 return 类型 Unit,因为这是 if 语句的两个分支的 return 类型。

if 分支以 println(dataTuple) 结束,其中 return 为 Unitelse分支以dataTuple = ...结尾,即变量赋值,即returnsUnit。如果你想让它return存储在dataTuple中的元组,你只需要在最后添加dataTuple

您可能想做什么?

(parsedJson.toString, validationMessages.mkString("[", ", ", "]"))

这将 return 一个包含第一个 parsedJson 作为字符串的元组,第二个 validationMessages 的每个元素,以任意顺序(因为 Set 是无序的) ,以 [ 开头,连续元素之间有一个 , ,最后是 ]

所以如果 parsedJson{"key1": "value1"} 并且 validationMessagesSet("unexpected key: key1", "missing key: key0") 这将 return ("{"key1":"value1"}",["unexpected key: key1", "missing key: key0"].

如果您不想在 .mkString 的 beginning/end 处放置一些特殊的东西,您可以仅使用中间参数(分隔符)来调用它。

如果validationMessages为空,则validationMessages.mkString("delimiter")return为空串,validationMessages.mkString("start", "delimiter", "end")return为"startend".

scala 的优点之一是您可以在一行中完成复杂的事情(只要您足够了解这门语言)。