scala-在方法中定义的Array(“ one”,“ two”)。mkString(“:”)返回WrappedArray,而不是String

时间:2018-12-27 11:28:34

标签: scala methods

scala>   def joinWith(separator: String, values: String*): String = {
     |     Array(values).mkString(separator)
     |   }
joinWith: (separator: String, values: String*)String

scala> joinWith(":", "one", "two")
res0: String = WrappedArray(one, two)   // shouldn't we get a String here?

scala> Array("one", "two").mkString(":")
res1: String = one:two                  // this works as expected but only like this

scala>

我期望返回String,但看到WrappedArray。为什么?

如果我想返回一个字符串,该如何定义函数?

2 个答案:

答案 0 :(得分:4)

我看到的joinWith函数的唯一问题是将变量参数转换为数组的方式。 Array(values)的结果具有类型Array[Seq[String]]-我怀疑这就是您想要的。这根本没有必要。参数values已作为Seq传递给您。您可能打算写values.mkString(separator)吗?

您看到的WrappedArray文本是mkString将值为Array的内部Array("one", "two")转换为字符串的结果。您没有获得类型为WrappedArray的值(这甚至是不可能的,因为您已经明确键入了返回String)的函数,所以得到的字符串值为WrappedArray(...)

答案 1 :(得分:1)

这对我有用:

def joinWith(separator: String, values: String*): String =
    Array(values:_*).mkString(separator)

以下是REPL:

scala> def joinWith(separator: String, values: String*): String = Array(values:_*).mkString(separator)
joinWith: (separator: String, values: String*)String

scala> joinWith(":", "a", "s")
res7: String = a:s

我认为问题在于您需要将_*指定为Array

如Suma所说,如果您未指定_*,则在创建数组时的类型为Array[Seq[String]]