【问题标题】:Scala case class is not matched in receive method (in akka actors)Scala 案例类在接收方法中不匹配(在 akka 演员中)
【发布时间】:2016-03-07 19:54:05
【问题描述】:

我有这样的事情:

class ProbeActor extends Actor {
  case class Probe(messageKey: String)
  def receiveProbe: Receive = {
    case Probe(probeKey) => println("Good probe: "+probeKey)
    case x => println("Bad probe: "+ x)
  }
  final override def receive = receiveProbe orElse receiveOther
  def receiveOther: Receive = {
    case _ => println("Other")
  }
}

我这样称呼它:

class Prober extends ProbeActor {
  val definite = ActorSystem("ProbeTest").actorOf(Props[ProbeActor], name = "probed")
  implicit val timeout = Timeout(5 second)
  val future = definite ? Probe("key")
}

我希望应该打印文本 "Good probe: key",但我得到了 "Bad probe: Probe(key)"

注意:如果我将Probe case 类放在外面,那么它工作正常。

【问题讨论】:

    标签: scala pattern-matching akka case-class


    【解决方案1】:

    经过更多搜索,我在scala-lang.org找到了答案:

    我认为潜在的误解是关于嵌套的身份 类类型。

    A 类 { B 类}

    类 A x 的每个新实例都会创建一个新类型 x.B。如果你这样做 您指的是特定的 A 内部的普通模式匹配 B 类 this.B 的实例。

    【讨论】:

    • 没错。我认为按照惯例,您应该将消息放入演员的同伴对象中,而不是放入演员本身。这样你就不应该有依赖类型的问题,并且你不必保留对演员的引用,这被认为是不好的
    【解决方案2】:

    一种在Probe 上进行模式匹配而不将其移出类的方法是

    case probe: ProbeActor#Probe => println("Good probe: "+probe.messageKey)
    

    当然,将它移到外面(例如移到伴生对象)是更好的解决方案;尤其是在 Akka 中,正如 Archeg 所提到的,避免直接引用演员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 2012-10-30
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      相关资源
      最近更新 更多