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

Posted

技术标签:

【中文标题】Scala在匹配多个案例类时提取参数以进行理解【英文标题】:Scala extract the parameter in for comprehension when match multiple cases classes 【发布时间】:2021-10-27 07:44:24 【问题描述】:

我有一个带有多个案例类的密封特征实现,每个案例类都有自己的参数,其中一些具有相同类型的参数(我想提取,在这种情况下: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


逻辑流程处理如下:

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()

我需要在 for comprehension 中添加一个函数,并且该函数需要一个 Trigger 作为参数。但是在匹配的情况下,并不是所有的事件都包含Trigger参数,EventD甚至有Option[]的形式。

是否有任何解决方案可以解决此问题,而无需解耦事件类型匹配并为每个案例复制 for 理解逻辑?

【问题讨论】:

【参考方案1】:

我认为您可以添加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))

【讨论】:

明亮且非常干净。

以上是关于Scala在匹配多个案例类时提取参数以进行理解的主要内容,如果未能解决你的问题,请参考以下文章

在scala中匹配多个案例类

在 Spark Scala 中使用自定义数据框类时任务不可序列化

使用多个 UIActivityProvider 类时没有 Twitter

“模块化”Scala 指南

在kotlin中使用带有rxjava的密封类时,类型不匹配

JavaScript 定义类时如何将方法提取出来