gpt4 book ai didi

scala - 查找没有实例的 Product 类型的数量

转载 作者:行者123 更新时间:2023-12-01 02:18:50 25 4
gpt4 key购买 nike

我想定义一个由泛型 Product 类型参数化的函数,但它可以计算出 Product 的数量。这是一个示例片段。我想在调用 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)它由 Product 类型参数化,(2)该函数仅在产品的数量匹配某个值时才有意义,当我知道时调用函数,(3) 在调用函数时获取 Product 的实例很昂贵/不可能。我的实际用例是基于 spark RDD 写出 SQL 语句的实用程序类。)

如有必要,我可以写出一整套函数,每个元组大小对应一个。但这感觉很糟糕,我希望有更好的解决方案。

最佳答案

使用类型类可以找到比编写不同方法更好的方法:

case class Arity[P]( get: Int )

object Arity {
def apply[P]( implicit arity: Arity[P] ) = arity
implicit def tuple2[A,B] = Arity[(A,B)]( 2 )
implicit def tuple3[A,B,C] = Arity[(A,B,C)]( 3 )
//...
}

def f[T<:Product:Arity](names:Seq[String], values:()=>T) = {
() => {
val x = values()
if ( Arity[T].get != names.size) scala.sys.error("Size mismatch")
names.zip(x.productIterator.map(_.toString).toSeq).map(kv => kv._1+"="+kv._2)
}
}

当然,您需要记下 Arity所有可能的元组大小的对象。您可以使用代码生成或(如果您有胆量和耐心)使用宏来自动执行此操作。

关于scala - 查找没有实例的 Product 类型的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com