我在Akka发现了一些奇怪的行为。匹配模式时,无法向列表添加消息:
var msgs: List[Message] = Message() :: Nil
...
override def receive: Receive = {
case msg @ Message => {
msgs = msgs.::(Message()) // ok
//msgs = msgs.::(msg) // doesn't work
sender ! "Thanks!"
}
case Request => { sender ! msgs.head }
case _ =>
}
这是一个错误Scala
或Akka
?
要修复它,我需要区分大小写
msgs = msgs.::(msg.asInstanceOf[Message])
这不是一个方便的解决方案。
问题是您在case语句中发生的匹配中犯了一个细微的错误。您在此处与Message
伴随对象而不是Message
案例类进行匹配。
看它的另一种方式是,case x @ Y
语法可以被认为是说:“比赛与类型的任何实例Y
,然后运行等同的val x: Y = <incoming value>.asInstanceOf[Y]
”,但在这里,您提供的推断类型是一个无参数的类型,称为Message
,其中,编译器必须是object Message
,不是case class Message()
。
因此,要修复此行,请写入参数列表。例如,如果Message
该类定义为:
case class Message()
这将会:
case msg @ Message() => ...
如果相反,我们说:
case class Message(text: String, id: Int)
然后,case语句变为:
case msg @ Message(txt, is) => ...
或者,如果我们不在乎(或需要使用)text
和id
参数:
case msg @ Message(_, _) => ...
对于此处发生的情况,从技术上来说,它的稍微有点技术上正确的描述,case语句实际上是尝试与伴随对象(也称为“提取程序”)中可用的任何“未应用”方法进行匹配。默认情况下,对于任何与case类构造函数中提供的参数列表完全匹配的case类,在伴随对象中将免费提供anapply
和unapply
方法。在上述Message
类的第二个版本中,相关unapply
方法将具有如下签名:
def unapply(text: String, id: Int): Option[Message]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句