gpt4 book ai didi

Scala 反射更新案例类 val

转载 作者:行者123 更新时间:2023-12-05 00:27:00 24 4
gpt4 key购买 nike

我在这里使用 scala 和 slick,并且我有一个 baserepository,它负责完成我的类的基本 crud。
对于设计决策,我们确实有 updateTime 和 createdTime 列都由应用程序处理,而不是由数据库中的触发器处理。这两个字段都是 joda DataTime 实例。
这些字段在称为 HasUpdatedAt 和 HasCreatedAt 的两个特征中定义,用于表

trait HasCreatedAt {
val createdAt: Option[DateTime]
}

case class User(name:String,createdAt:Option[DateTime] = None) extends HasCreatedAt

我想知道如何使用反射来调用用户复制方法,在数据库插入方法期间更新 createdAt 值。

在@vptron 和@kevin-wright 评论后编辑

我有一个这样的 repo
trait BaseRepo[ID, R] {

def insert(r: R)(implicit session: Session): ID
}

我只想实现一次插入,并且我想在那里更新 createdAt,这就是为什么我不使用 copy 方法,否则我需要在使用 createdAt 列的任何地方实现它。

最佳答案

此处回答了此问题以帮助其他人解决此类问题。
我最终使用此代码使用 Scala 反射来执行我的案例类的复制方法。

import reflect._
import scala.reflect.runtime.universe._
import scala.reflect.runtime._

class Empty

val mirror = universe.runtimeMirror(getClass.getClassLoader)
// paramName is the parameter that I want to replacte the value
// paramValue is the new parameter value
def updateParam[R : ClassTag](r: R, paramName: String, paramValue: Any): R = {

val instanceMirror = mirror.reflect(r)
val decl = instanceMirror.symbol.asType.toType
val members = decl.members.map(method => transformMethod(method, paramName, paramValue, instanceMirror)).filter {
case _: Empty => false
case _ => true
}.toArray.reverse

val copyMethod = decl.declaration(newTermName("copy")).asMethod
val copyMethodInstance = instanceMirror.reflectMethod(copyMethod)

copyMethodInstance(members: _*).asInstanceOf[R]
}

def transformMethod(method: Symbol, paramName: String, paramValue: Any, instanceMirror: InstanceMirror) = {
val term = method.asTerm
if (term.isAccessor) {
if (term.name.toString == paramName) {
paramValue
} else instanceMirror.reflectField(term).get
} else new Empty
}

有了这个,我可以执行我的案例类的复制方法,替换一个确定的字段值。

关于Scala 反射更新案例类 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431263/

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