我想定義一個函數,該函數通過一般的產品類型進行參數化,但可以計算產品的實體。這是一個示例代碼片段。我想在調用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的每個尺寸。但那感覺很糟糕,我希望有更好的解決方案。