我需要编写一个函数,它接受任意大小的字符串元组,在每个元素上调用trim并返回一个新的元组。我有点陷在下面这一点,代码已经不是类型安全了。另外,一旦我将它转换为迭代器,我不知道如何回到元组。有没有更优雅的方法来解决这个问题?解决方案需要适用于Scala 2.9.2
def trim(input:Product)={
input.productIterator.asInstanceOf[Iterator[String]].map(_.trim)
}
答案 0 :(得分:16)
如果您愿意使用使用Shapeless的解决方案,这非常简单(至少在无形状方面):
import shapeless._
object trimmer extends (String -> String)(_.trim)
def trim[T <: Product, L <: HList](t: T)(implicit
hlister: HListerAux[T, L],
toList: ToList[L, String],
mapper: MapperAux[trimmer.type, L, L],
tupler: TuplerAux[L, T]
) = hlister(t).map(trimmer).tupled
然后:
scala> trim((" a ", "b ", " c"))
res0: (String, String, String) = (a,b,c)
scala> trim((" a ", "b ", " c", "d"))
res1: (String, String, String, String) = (a,b,c,d)
所有内容都是静态输入的,如果你尝试用任何非String
元素提供一个元组,你将在编译时遇到错误。
如果没有像Shapeless这样的库,它可以为你有效地打包所有样板 - 你会遇到两种选择:放弃类型安全,或为你关心的每个元组大小写一个特殊的案例(最多为22)。