Scala 在匹配多个案例类时提取参数以供理解

Cyp*_*ius 1 scala pattern-matching for-comprehension

我有一个带有多个 case 类的密封 trait 实现,每个 case 类都有自己的参数,其中一些具有相同类型的参数(我想提取,在这种情况下Trigger:),其中一些没有。

sealed trait Event

object MyTrait {
  final case class EventA(context: Context) extends Event

  final case class EventB(trigger: Trigger) extends Event

  final case class EventC(trigger: Trigger) extends Event

  final case class EventD(trigger: Option[Trigger] = None) extends Event

  ...

  final case class EventZ(factor: Factor) extends Event

}
Run Code Online (Sandbox Code Playgroud)

逻辑流程处理如下:

event match {
 case ev @(_: Event.EventA | _: Event.EventB |
      _: Event.EventC | _: Event.EventD) =>
   val amount = for {
     count1 <- countThis
     count2 <- countThat
     // My logic added here
     _      <- handleSomeTypeOfEvent(ev.trigger)  // Doesn't work due to difference in implementations of event types
   } yield res + another

 case _ => doSomethingElse()
}
Run Code Online (Sandbox Code Playgroud)

我需要在 for comprehension 中添加一个函数,该函数需要 aTrigger作为参数。但在 match 的情况下,并非所有事件都包含Trigger参数,EventD甚至以Option[].

是否有任何解决方案可以在不解耦事件类型匹配并为每种情况复制理解逻辑的情况下解决此问题?

Bor*_*nov 5

我认为您可以添加extractTrigger函数并更改签名handleSomeTypeOfEvent以接受Option[Trigger]值:

def extractTrigger(event: Event): Option[Trigger] =
  event match {
    case EventB(trigger) => Some(trigger)
    case EventC(trigger) => Some(trigger)
    case EventD(trigger) => trigger
    case _               => None

  }

def handleSomeTypeOfEvent(maybeTrigger: Option[Trigger]): String = ???

val ev: Event = ???
handleSomeTypeOfEvent(extractTrigger(ev))
Run Code Online (Sandbox Code Playgroud)