阿卡.有没有办法在两个接收之间共享代码



假设我有几个接收和使用becom() unbecome()在它们之间切换。所有接收都有一些常见的消息处理。喜欢这个:

class Test extends Actor {
  override def receive: Receive = first
  def first: Receive = {
    case "common" => // how to share?
      println("common stuff")
    case "second" =>
      println("move to second")
      context.become(second)
  }
  def second: Receive = {
    case "common" =>  // how to share?
      println("common stuff")
    case "first" =>
      println("move to first")
      context.become(first)
  }
}

现在我看到两种方式:

  • "常见"和在某个函数中处理它,例如handleCommon()
  • 合并接收喜欢这个,但对我来说似乎不对。

这是第二个示例:

class Test extends Actor {
      override def receive: Receive = merge(common, first)
      def common: Receive = {
        case "common" =>
          println("common stuff")
      }
      def first: Receive = {
        case "second" =>
          println("move to second")
          context.become(merge(common, second))
      }
      def second: Receive = {
        case "first" =>
          println("move to first")
          context.become(merge(common, first))
      }
      private def merge(functions: Receive*): Receive = {
        case any =>
          val fOpt = functions find (_.isDefinedAt(any))
          if (fOpt.isDefined) {
            fOpt foreach (f => f(any))
          } else {
            unhandled(any)
          }
      }
    }

我相信必须有更好的方法来做到这一点。有吗?

您可以使用

orElse

def common: Receive = {
  case "common" =>
    println("common stuff")
}
def first: Receive = ({
  case "second" =>
    println("move to second")
    context.become(second)
}: Receive) orElse common
def second: Receive = ({
  case "first" =>
    println("move to first")
    context.become(first)
}: Receive) orElse common

请注意,您必须在表达式末尾显式注释类型,否则 scala 将推断Function1而不是Receive

最新更新