微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定行为实例后,我可以对其应用一条消息来创建新行为

如何解决给定行为实例后,我可以对其应用一条消息来创建新行为

在一种情况下,我正在处理一个通用行为,当收到消息时,它需要一些额外的信息:

case class A(count: Int)

type MyBehavior[T] = Behavior[(A,T)]

用于处理这些额外信息的代码可能类似于以下内容

case class B(str: String)

def active(b: B): MyBehavior[B] = Behaviors.receiveMessage {
  case (a,b) =>
    active(b.copy(str = a.count.toString)
}

然后我有一个函数来一般处理此行为。但是,鉴于对行为的引用,我不知道如何向其应用消息以创建新行为:

def f[T](a: A,behavior: MyBehavior[T])(implicit ct: classtag[T]): Behavior[T] =
    Behaviors.receiveMessage {
        case t: T =>
            val newBehavior: MyBehavior[T] = ???   // Can I pass a and t?
            f(a.copy(count = a.count + 1),newBehavior)
}

我是否可以将消息应用于行为以创建新行为?

解决方法

您可以使用context生成新的演员,并从当前演员发送消息给if。这样,您可以在该参与者执行操作之前先“添加”一些逻辑。

Behaviors.setup { context =>

  def f[T](implicit ct: ClassTag[T]): Behavior[(A,T)] =
    Behaviors.receiveMessage {
      case (a: A,t: T) =>
        val newA = a.copy(count = a.count + 1)
        val newActor = context.spawn(f[T])
        newActor ! (newA,t)
    }
}

代码中缺少的重要内容-行为是演员的食谱,但不是演员本身的 。您必须使用ActorSystem(behavior,actorSystemName)(进入整个系统)或通过context.spawn(behavior)实例化它。否则,递归调用将只是递归调用,而不是从actor向新生成的actor发送消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。