Scala中的case class在接收方法(在Akka actors中)中无法匹配

4

我有一个类似这样的代码:

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案例类放在外面,那么它就能正常工作。

2个回答

6

在进一步搜索后,我在 scala-lang.org 找到了答案:

我认为根本的误解在于嵌套类类型的身份。

class A { class B }

每个类 A 的新实例 x 都会创建一个新类型 x.B。如果你在 A 内部执行普通模式匹配,则引用特定实例的类型 B this.B。


2
没错。我认为按照惯例,你应该将消息放到演员的伴生对象中,而不是演员本身。这样就不会有依赖类型的问题,也不必保留对演员的引用,因为这被认为是不好的。 - Archeg

2
不必将Probe移出类,可以使用模式匹配的方式进行匹配。
case probe: ProbeActor#Probe => println("Good probe: "+probe.messageKey)

当然,将其移至外部(例如伴生对象)是更好的解决方案;特别是在Akka中,正如Archeg所提到的,以避免直接引用actor。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接