gpt4 book ai didi

scala - 当参数列表相同时,将一个 case class 转换为另一个 case class

转载 作者:行者123 更新时间:2023-12-04 10:07:09 26 4
gpt4 key购买 nike

我有很多类似的案例类,它们意味着不同的东西,但具有相同的参数列表。

object User {
case class Create(userName:String, firstName: String, lastName: String)
case class Created(userName:String, firstName: String, lastName: String)
}

object Group {
case class Create(groupName:String, members: Int)
case class Created(groupName:String, members: Int)
}

鉴于这种设置,我厌倦了编写接受 Create 类型参数并返回 Created 类型参数的方法。我有大量的测试用例可以做这种事情。

我可以编写一个函数来将一个案例类转换为另一个案例类。此函数转换 User.Create进入 User.Created
def userCreated(create: User.Create) = User.Create.unapply(create).map((User.Created.apply _).tupled).getOrElse(sys.error(s"User creation failed: $create"))

我不得不为 Group 编写另一个这样的函数。
我真正想要的是一个通用函数,它接受两种类型的案例类和一个案例类的对象,然后转换为另一种。就像是,
def transform[A,B](a: A):B

此外,此功能不应违背减少样板的目的。如果更易于使用,请随时为该函数建议不同的签名。

最佳答案

作为记录,这是我设法实现的最简单的类型安全语法:

implicit class Convert[A, RA](value: A)(implicit ga: Generic.Aux[A, RA]) {
def convertTo[B, RB](gb: Generic.Aux[B, RB])(implicit ev: RA =:= RB) =
gb.from(ga.to(value))
}

它可以像这样使用:
case class Create(userName: String, firstName: String, lastName: String)
case class Created(userName: String, firstName: String, lastName: String)

val created = Create("foo", "bar", "baz").convertTo(Generic[Created])

或与 LabelledGeneric 相同的事情实现更好的类型安全:
implicit class Convert[A, RA](value: A)(implicit ga: LabelledGeneric.Aux[A, RA]) {
def convertTo[B, RB](gb: LabelledGeneric.Aux[B, RB])(implicit ev: RA =:= RB) =
gb.from(ga.to(value))
}

val created = Create("foo", "bar", "baz").convertTo(LabelledGeneric[Created]))

关于scala - 当参数列表相同时,将一个 case class 转换为另一个 case class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949455/

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