首先,請注意,斯卡拉演員圖書館已被棄用,以支持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
是否是案例類,答案是你不能(通過設計)。 case class只是普通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
具有相同數量和類型參數作爲構造函數。
相關? http://stackoverflow.com/questions/13329535/implicitly-logging-messages-received-by-an-actor-in-scala – Brian