首先,请注意 Scala 演员库正在被 Akka 弃用。所以这个答案不会有很长时间的帮助(尽管其他演员库将继续可用一段时间——而且如果人们想要维护它,它可能永远是开源的)。
无论如何,该react
方法定义在scala.actors.Actor
. 只是无法导入它,或者用你自己的隐藏它。你自己的什么?
好吧,该方法只需要一个PartialFunction[Any,Unit]
. 因此,您还应该:
def react(pf: PartialFunction[Any,Unit]): Nothing = { /*how?;*/ Actor.react(/*what?*/) }
您实际上只能访问部分功能,并且您必须按照Actor.react
自己的意愿去做。所以你需要包装pf
另一个PartialFunction
执行你的日志记录。这样你就可以
val qf = new PartialFunction[Any,Unit] {
def isDefinedAt(a: Any) = pf.isDefinedAt(a)
def apply(a: Any): Unit = {
log(a) // Maybe add more logic to know what a is
pf(a)
}
}
如果您想查看进来并被检查但实际上并未被消费的消息,您可以使用isDefinedAt
also.
所以,很明显,我希望,/*how?*/
上面定义 (create) qf
,并且/*what?*/
只是qf
.
如果你想知道是否a
是一个案例类,答案是你不能(按设计)。案例类只是普通 Scala 特性之上的语法糖;它只是为了节省您的打字时间。例如,参见这个问题。
但是,您可以通过模式匹配Product
并检查它是否具有copy
方法来非常接近:
case class M(i: Int)
val a: Any = M(5)
scala> a match {
case p: Product if p.getClass.getMethods.exists(_.getName=="copy") => println("Yes")
case _ => println("No")
}
Yes
如果你真的想花哨,请检查是否copy
与构造函数具有相同数量和类型的参数。