Scala:如何在元组的每个元素上调用trim

Man*_*raf 6 scala tuples

我需要编写一个函数,它接受任意大小的字符串元组,在每个元素上调用trim并返回一个新的元组.我有点陷在下面这一点,代码已经不是类型安全了.另外,一旦我将它转换为迭代器,我不知道如何回到元组.有没有更优雅的方法来解决这个问题?解决方案需要适用于Scala 2.9.2

  def trim(input:Product)={
    input.productIterator.asInstanceOf[Iterator[String]].map(_.trim)
  }
Run Code Online (Sandbox Code Playgroud)

Tra*_*own 16

如果你愿意使用一个使用Shapeless的解决方案,这非常简单(至少在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
Run Code Online (Sandbox Code Playgroud)

然后:

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)
Run Code Online (Sandbox Code Playgroud)

一切都是适当的静态输入,如果你尝试用任何非String元素提供它的元组,你将在编译时得到一个错误.

没有像Shapeless这样的库,它可以为你有效地打包所有的样板 - 你有两种选择:放弃类型安全,或为你关心的每个元组大小写一个特殊的案例(最多22个).

  • @pedrofurla:是的.这也是很多编译时证据证明你的类型是正确的. (3认同)
  • 您需要对代码进行基准测试才能找到答案,但我对Shapeless的体验是性能通常比我预期的要好.我认为这是因为大多数工作都是在编译时完成的 - 没有运行时反射或类似的. (2认同)