6

我需要编写一个函数,该函数采用任意大小的 String 元组,对每个元素调用 trims 并返回一个新元组。我有点卡在下面的这一点上,代码已经不是类型安全的。此外,一旦将元组转换为迭代器,我不知道如何返回元组。有没有更优雅的方法来解决这个问题?解决方案需要在 Scala 2.9.2 上运行

  def trim(input:Product)={
    input.productIterator.asInstanceOf[Iterator[String]].map(_.trim)
  }
4

1 回答 1

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

进而:

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 个)。

于 2013-05-09T22:34:06.950 回答