写一个更实用的方法吗?

时间:2016-06-04 15:30:17

标签: scala function pattern-matching

我正在考虑某事,我用两个扩展它的类和另一个可能包含它的类来编写这个特性:

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..

我想知道是否有另一种方法可以做到这一点?我不知道这是否是一种“功能性”的方式,或者是否有一种不那么冗长的方式?

我问,因为基本上我可以编写更多方法,如subtractmultiply等...我有一些非常常见的代码。

我可以提取该公共代码并编写一个函数,它只需要两个subObj和一个操作,然后对这两个对象应用该操作,但这只是抽象出常见的操作,可能是主要的模式匹配部分的写法不同,可以认为更简洁(缺少更好的词)?

2 个答案:

答案 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 _ => ???
}