まず、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 機能の上にある単なる構文糖衣です。入力を節約するためだけに存在します。たとえば、この質問を参照してください。
ただし、パターンマッチングとメソッド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
は、コンストラクターと同じ数と型のパラメーターがあるかどうかを確認してください。