【发布时间】:2014-10-01 19:13:13
【问题描述】:
我正在尝试编写一个样板函数,它可以采用一对通用案例类对象并对它们的 vals 集执行一些操作,然后返回案例类的新实例。
在更详细的层面上,这不是这个问题的预期重点,我正在执行的操作是压缩两个两个 val 列表,并有选择地决定通过 List 将元组的哪个项目放入新实例中[布尔] 表示左侧或右侧对象的标志。
我已经写好了大部分概念,到目前为止,我的研究结果是,我的策略是将案例类对象转换为 val 列表(使用 Product.productIterator),然后最终转换为将 vals 放入一个元组 (SO reference) 以馈入 Function.tupled (SO reference)(可用于案例类)。
trait PermissionMask[B <: Product] {
val permissionMask: List[Boolean]
def mergePermissibleEdits(userObject: B, trustedObject: B) = {
val possibleValues = (userObject.productIterator.toList) zip (trustedObject.productIterator.toList)
val valuesWithFlags = possibleValues zip permissionMask
val mergedObjectList = valuesWithFlags map { case ((userValue, trustedValue), userEditable) => if (userEditable) userValue else trustedValue }
//TODO: Not possible, I don't have a direct reference to the case class since it's generic, not sure how to get the reference
B.tupled(mergedObjectList) //I have implicit conversions to tuple1-22 from list
}
}
如果我没有使用泛型并且知道具体的案例类,我可以简单地调用 SomeCaseClass.tupled(mergedObjectList)。但是,由于它是通用的,我对如何(如果可能的话)进行相同的调用很模糊。
【问题讨论】:
-
这种事情一般来说并不容易,Shapeless已经为你做了很多工作。
-
请注意,如果您的案例类只有一个元素,那么
apply方法是Function1,它没有tupled函数,2+ 有元组。
标签: scala