Scala 3如何为Product类型自动推导RowEncoder实现通用toCsv方法
问题原因
你当前使用的RowEncoder实例仅为Tuple类型实现,直接为任意Product类型A查找RowEncoder[A]不存在对应的隐式实例,需要借助Scala3的Mirror.ProductOf镜像关联Product类型与其对应的元组类型,复用已有的元组RowEncoder实现即可解决问题。
解决方案
方案1:直接修改toCsv方法(无需改动现有RowEncoder定义)
直接在方法的上下文参数中声明获取Product对应元组类型的RowEncoder实例即可:
def toCsv[A <: Product](t: A)(using m: scala.deriving.Mirror.ProductOf[A], enc: RowEncoder[m.MirroredElemTypes] ): List[String] = { val tuple = Tuple.fromProductTyped(t) enc.encodeRow(tuple) }
修改后直接调用toCsv(Employee("Bob", 42, false))即可得到预期输出。
方案2:全局派生RowEncoder的Product适配规则(一劳永逸)
如果希望所有case class都能自动获得RowEncoder能力,不需要每次调用都手动声明镜像参数,可以在RowEncoder的伴生对象中添加如下自动派生规则:
object RowEncoder: // 此处保留你原有的Tuple类型相关RowEncoder实例实现 // 新增Product类型自动派生规则 given [A <: Product](using m: scala.deriving.Mirror.ProductOf[A], enc: RowEncoder[m.MirroredElemTypes] ): RowEncoder[A] with override def encodeRow(a: A): List[String] = enc.encodeRow(Tuple.fromProductTyped(a))
添加该规则后,你原来的错误写法也可以正常运行,同时任意case class都可以直接作为RowEncoder的泛型参数使用。
内容的提问来源于stack exchange,提问作者gekomad
相关产品推荐
相关产品推荐

