0

检测 scala actor 中接收到的消息类型的常用方法是

loop{
     react{
            case x: String =>
           }
     }

但是,我想知道我们如何覆盖这个 react 构造的实现,以便我们可以对收到的消息进行隐式记录。

我正在尝试实现下面提到的用例-> 1。在消息与任何案例类匹配之前,我想在控制台/文件上编写一条日志语句,显示消息的出现。2. 我们可以通过 println() / log4j logging 显式记录这些消息。但是,我想为 scala 演员设计一个通用记录器,它将记录所有发送或接收的消息。

在这方面的任何帮助都会有所帮助。提前致谢

4

2 回答 2

1
//Following is a code for a logReact Method that does the same thing as react but also logs the message received hope this works for you
import scala.actors.Actor;
import scala.actors.Actor._

trait ActorLogging extends Actor {
    def logReact(handler: PartialFunction[Any, Unit]): Nothing = {
        val handler2: PartialFunction[Any, Unit] = {
            case x =>
                println("Inside Logs -- with message recieved  -- " + x.toString);
                handler.apply(x);
        }
        super.react(handler2)
    }
}

class sumAct extends Actor with ActorLogging {
    def act() {
        loop {
            logReact {
                case a: Int =>
                    println("Inside actor Sum Act Received the message -- " + a)
                    exit;
            }
        }
    }
}

object ActorLog {
    def main(args: Array[String]): Unit = {
        var s: sumAct = new sumAct;
        s.start();
        s ! 1.toInt;
    }
}
于 2012-11-16T18:18:28.583 回答
1

首先,请注意 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与构造函数具有相同数量和类型的参数。

于 2012-11-14T23:08:03.980 回答