我如何讨论String.format函数以将其与数组上的映射一起使用?

时间:2012-01-30 20:21:13

标签: scala

我有一个字符串数组,我需要把它们变成带引号的字符串。显然我可以迭代数组并使用"\"%s\"".format(elem)之类的东西来替换每个元素,但考虑到我的下一步将是arr.mkString("(", "OR", ")")

,这似乎很蹩脚

我尝试按如下方式调整String.format:

val curried = "\"%s\"".format(_)
arr.map(curried)

但这不起作用并抱怨:

 found   : (Any*) => String
 required: (java.lang.String) => ?

如何在字符串数组上映射String.format之类的函数?还有另一种方式来讨论它或者我应该指定类型吗?

2 个答案:

答案 0 :(得分:8)

您需要帮助编译一点,并指定所需的类型(至少它是您问题的可能解决方案之一):

val curried = "\"%s\"".format(_: String) 

否则编译器将生成Seq[Any] => String函数,因为format方法有varargs。

答案 1 :(得分:1)

或许写一个通用的unvararg。 (将(A*) => B转换为Seq[A] => B的函数。)

scala> def unvararg[A, B](f: (A*) => B): Seq[A] => B = x => f(x: _*)
unvararg: [A, B](f: A* => B)Seq[A] => B

scala> def seqSingleton[A](x: A): Seq[A] = Seq(x)
seqSingleton: [A](x: A)Seq[A]

scala> val ss = Array("hello", "world")
ss: Array[java.lang.String] = Array(hello, world) 

scala> ss.map((seqSingleton[String] _) andThen unvararg("\"%s\"".format))
res8: Array[String] = Array("hello", "world")