gpt4 book ai didi

scala - 让一种方法接受两种不同模型的 Scala 最佳实践是什么

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

目前我有一个接受 ModelA 并知道对其执行操作的方法。

所以在我的 Controller 中我接受了 ModelA 的请求并用它调用这个方法。

现在,我希望能够接受 ModelB 的请求,将请求映射到 ModelA(因为它具有相同的数据,但不是全部并使用不同的名称),并用它调用此方法。

假设该方法看起来像:

def myMethod(data: ModelA): ResModel = {
// do something with data
}

我的 Controller 目前是:

def doActions(): Action[JValue] = { request => 
val dataExctracted = request.body.extract[ModelA]
myMethod(dataExctracted)
...
}

我的两个模型都只是单独文件中的案例类:

case class ModelA(a: String, b: String, c: String)

case class ModelB(aAsDifferentName: String, bAsDifferntName: String)

让 myMethod 接受两个模型(没有 Either)的 Scala 最佳实践是什么? Controller 应该如何应对?

是否还有一种经典的方法可以返回不同的模型而不必接受不同 Controller 方法中的调用?

谢谢!

最佳答案

您可以尝试对联合类型建模(如 Dotty 中的 Int | String)。

像这样:

scala> case class Or[A, B](a: A, b: B)
defined class Or

scala> def test(v: Int Or String): String = {
| v.toString
| }
test: (v: Or[Int,String])String

scala> implicit def Int2Or(x: Int): Int Or String = Or(x, "")
Int2Or: (x: Int)Or[Int,String]

scala> implicit def String2Or(x: String): Int Or String = Or(-1, x)
String2Or: (x: String)Or[Int,String]

scala> test(1)
res0: String = Or(1,)

scala> test("")
res1: String = Or(-1,)

很酷的是,你可以像这样使用OrString Or Boolean,但这绝对不是真正的联合类型来自多蒂。

在我看来,直截了当的解决方案是使用密封特征并进行模式匹配。

关于scala - 让一种方法接受两种不同模型的 Scala 最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840013/

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