首先,请注意 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 做更多事情。
所以,很明显,我希望/*how?*/ 是上面定义(创建)qf,而/*what?*/ 只是qf。
如果你想知道a 是否是一个案例类,答案是你不能(按设计)。案例类只是普通 Scala 特性之上的语法糖;它只是为了节省您的打字时间。例如,请参阅this question。
但是,您可以通过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的参数数量和类型是否与构造函数相同。