目前我有一个接受 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,)
很酷的是,你可以像这样使用Or
类String Or Boolean
,但这绝对不是真正的联合类型来自多蒂。
在我看来,直截了当的解决方案是使用密封特征并进行模式匹配。
关于scala - 让一种方法接受两种不同模型的 Scala 最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840013/