我正在考虑某事,我用两个扩展它的类和另一个可能包含它的类来编写这个特性:
sealed trait MainObj
case object subObj1 extends mainObj
case Object subObj2 extends mainObj
case class AnotherClass(val mo: Option[MainObj], val amount: Int)
现在假设我想编写一个函数,在两个AnotherClass
个对象中添加金额,但前提是每个对象中的可选MainObj
是相同的类型。如果两者都是subObj1
,则仅添加。
所以我可以这样做:
def add(one: AnotherClass, two: AnotherClass): AnotherClass = one. mo, two.mo match {
case (Some(x), Some(y)) if i and x are the same class => return a `AnotherClass` with the two integers added from `one` and `two`
etc..
我想知道是否有另一种方法可以做到这一点?我不知道这是否是一种“功能性”的方式,或者是否有一种不那么冗长的方式?
我问,因为基本上我可以编写更多方法,如subtract
,multiply
等...我有一些非常常见的代码。
我可以提取该公共代码并编写一个函数,它只需要两个subObj
和一个操作,然后对这两个对象应用该操作,但这只是抽象出常见的操作,可能是主要的模式匹配部分的写法不同,可以认为更简洁(缺少更好的词)?
答案 0 :(得分:1)
只需将“添加”方法添加到案例类:
sealed trait MainObj
case object SubObj1 extends MainObj
case object SubObj2 extends MainObj
case class AnotherClass(val mo: Option[MainObj], val amount: Int){
def add(that:AnotherClass):AnotherClass = {
if (that.mo == this.mo)
this.copy(amount = this.amount + 1)
else
this
}
}
val x = AnotherClass(Some(SubObj1), 1)
val y = AnotherClass(Some(SubObj1), 1)
val z = AnotherClass(Some(SubObj2), 1)
scala> x add y
res5: AnotherClass = AnotherClass(Some(SubObj1),2)
scala> x add z
res6: AnotherClass = AnotherClass(Some(SubObj1),1)
scala> val l = List(x,y,z)
l.reduce ( _ add _)
res7: AnotherClass = AnotherClass(Some(SubObj1),2)
答案 1 :(得分:0)
val mo = two.mo
one match {
case AnoterClass(`mo`, am) =>
one.copy(amount = am + two.amount)
case _ => ???
}