首先,请注意 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)
}
}
如果您想查看进来并被检查但实际上并未被消费的消息,您可以使用isDefinedAtalso.
所以,很明显,我希望,/*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与构造函数具有相同数量和类型的参数。