gpt4 book ai didi

scala - 展开/剥离无形余积对象

转载 作者:行者123 更新时间:2023-12-01 11:21:45 26 4
gpt4 key购买 nike

我有一个如下所示的域:

package object tryme {
type ALL = AlarmMessage :+: PassMessage :+: HeyMessage :+: CNil
}
import com.tryme._

trait PayloadKind
trait Command extends PayloadKind
trait Event extends PayloadKind

trait Message[+T <: PayloadKind] {
val id: String
val payload: T
}

case class Alarm(severity: Int) extends Event
case class Pass(reason: String) extends Event
case class Hey(order: String) extends Command

case class AlarmMessage(id: String, payload: Alarm) extends Message[Event]
case class PassMessage(id: String, payload: Pass) extends Message[Event]
case class HeyMessage(id: String, payload: Hey) extends Message[Command]

case class AvroMessage(
id: String,
cargo: ALL
)

如果我用 cargo = HeyMessage 创建一个 AvroMessage,我就能成功地序列化/反序列化它。

当我检查反序列化的 AvroMessage 对象的 cargo 字段时,它看起来像这样:

Inr(Inr(Inl(HeyMessage(art333,Hey(wow)))))

在 Shapeless 中,如何打开/剥离所有 Inr/Inls?理想情况下,如果我可以避免的话,我不想关心(反序列化后)有效负载是 HeyMessage(或任何其他类型)。我要将 cargo 转换到 Message[PayloadKind],但首先我需要打开它。

(我看到了类似问题的答案 here ,但我承认我不明白它是如何工作的,也无法适应它。)

最佳答案

您可以使用shapeless.ops.coproduct.Selector

val coproduct = Inr(Inr(Inl(HeyMessage(art333, Hey(wow)))))
Selector[ALL, HeyMessage].apply(coproduct).get

结果是 HeyMessage(art333,Hey(wow))

https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/ops/coproduct.scala#L41-L60

关于scala - 展开/剥离无形余积对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com