让一个方法接受两个不同的模型,Scala的最佳实践是什么
目前,我有一个方法可以接受让一个方法接受两个不同的模型,Scala的最佳实践是什么,scala,json4s,Scala,Json4s,目前,我有一个方法可以接受ModelA,并知道如何对其执行操作 因此,在我的控制器中,我接受ModelA的请求,并用它调用这个方法 现在,我希望能够接受ModelB的请求,将请求映射为ModelA的请求(因为它具有相同的数据,而不是所有数据,并且名称不同),并使用它调用此方法 假设方法如下所示: def myMethod(data: ModelA): ResModel = { // do something with data } 我目前的控制者是: def doActions():
ModelA
,并知道如何对其执行操作
因此,在我的控制器中,我接受ModelA
的请求,并用它调用这个方法
现在,我希望能够接受ModelB的请求,将请求映射为ModelA的请求(因为它具有相同的数据,而不是所有数据,并且名称不同),并使用它调用此方法
假设方法如下所示:
def myMethod(data: ModelA): ResModel = {
// do something with data
}
我目前的控制者是:
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)
Scala的最佳实践是什么,让myMethod同时接受两种模型(没有或)?控制器对此的反应是什么
还有一种经典的方法可以返回不同的模型,而不必接受不同控制器方法中的调用吗
谢谢 您可以尝试对联合类型进行建模(如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,)
最酷的是,您可以像这样使用或类字符串或布尔值,但这绝对不是Dotty真正的联合类型
在我看来,strait forward解决方案是使用密封特征并进行模式匹配。让他们实现虚拟特征并对类型进行模式匹配。您将如何决定从请求主体中提取什么类型?
?问题是您如何知道或(-1,”
是什么?当我们想要的是联合类型(密封特征)时,case类是产品类型。直截了当的解决方案是两者都不做,而是使用不同的路线!:p@AndyHayden说得好!当然,正如我所说的,更简单的解决方案是使用trait甚至重载方法。这是对仅仅使用或的改进吗?OP说他们不想使用或者
,但是你的或者
只是或者
在一个不同的名称下,除了(安迪指出的)错误实现之外。