假设我有几个接收和使用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
。