我想定义一个函数,该函数通过一般的产品类型进行参数化,但可以计算产品的实体。这是一个示例代码片段。我想在调用f(...)时执行arity检查,而不是调用f(...)()时。我怎样才能做到这一点?查找产品类型的实体,不包含实例
def f[T<:Product](names:Seq[String], values:()=>T) = {
() => {
val x = values()
if (x.productArity != names.size) scala.sys.error("Size mismatch")
names.zip(x.productIterator.map(_.toString).toSeq).map(kv => kv._1+"="+kv._2)
}
}
(这是一个很没用的功能,只是为了演示。最重要的点是:(1)它是由产品类型参数,(2)如果该产品的元数相匹配的功能才有意义(3)当我调用函数时,获取产品的实例是昂贵的/不可能的我的实际用例是一个用于写出SQL语句的实用类,它基于火花RDD。)
如果有必要,我可以写出一整套函数,每一个函数都适用于Tuple的每个尺寸。但那感觉很糟糕,我希望有更好的解决方案。