gpt4 book ai didi

部分模型的Scala成语?

转载 作者:行者123 更新时间:2023-12-04 14:44:19 24 4
gpt4 key购买 nike

我正在编写一个 HTTP REST API,我想要 Scala 中的强类型模型类,例如如果我有汽车模型Car , 我想创建如下 RESTful /car接口(interface):

1) 对于 POST s(创建一辆新车):

case class Car(manufacturer: String, 
name: String,
year: Int)

2) 对于 PUT s(编辑现有汽车)和 GET s,我想标记 id也:
case class Car(id: Long, 
manufacturer: String,
name: String,
year: Int)

3) 对于 PATCH es(部分编辑现有汽车),我想要这个部分对象:
case class Car(id: Long, 
manufacturer: Option[String],
name: Option[String],
year: Option[Int])

但是为基本相同的事情保留 3 个模型是多余的并且容易出错(例如,如果我编辑一个模型,我必须记住编辑其他模型)。

是否有一种类型安全的方式来维护所有 3 个模型?我也可以接受使用宏的答案。

我确实设法将前两个组合如下
trait Id {
val id: Long
}

type PersistedCar = Car with Id

最佳答案

我会选择类似的东西

  trait Update[T] {
def patch(obj: T): T
}

case class Car(manufacturer: String, name: String, year: Int)

case class CarUpdate(manufacturer: Option[String],
name: Option[String],
year: Option[Int]) extends Update[Car] {
override def patch(car: Car): Car = Car(
manufacturer.getOrElse(car.manufacturer),
name.getOrElse(car.name),
year.getOrElse(car.year)
)
}


sealed trait Request
case class Post[T](obj: T) extends Request
case class Put[T](id: Long, obj: T) extends Request
case class Patch[T, U <: Update[T]](patch: U) extends Request

使用 Post & Put 一切都很简单。用 Patch 稍微复杂一点。我很确定 CarUpdate 类可以替换为使用宏自动生成的类。

如果你要更新你的汽车模型,你肯定不会忘记补丁,因为它会在编译时失败。然而,这两个模型看起来太“复制粘贴”了。

关于部分模型的Scala成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458377/

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