Scala 使用Context.actorOf时,如何将回调函数传递给akka actor构造函数?

Scala 使用Context.actorOf时,如何将回调函数传递给akka actor构造函数?,scala,akka,Scala,Akka,我想将回调传递给其构造函数中的akka参与者: object FSMActorWithCallback { type Tracer = (Int, NodeState, NodeData, ActorRef, Any) => Unit } class FSMActorWithCallback(tracerCallback: FSMActorWithCallback.Tracer) extends FSMAwesomeActor // method is called each F

我想将回调传递给其构造函数中的akka参与者:

object FSMActorWithCallback {
  type Tracer = (Int, NodeState, NodeData, ActorRef, Any) => Unit
}

class FSMActorWithCallback(tracerCallback: FSMActorWithCallback.Tracer) extends FSMAwesomeActor
  // method is called each FSM Event so we can record current state and next message 
  override def trace(state: NodeState, data: NodeData, sender: ActorRef, msg: Any) : Unit = {
    // different tracing callback for different test rigs such as unit tests or integration tests
    tracerCallback(nodeUniqueId, state, data, sender, msg)
  }
}
这将允许我使用
new
定义原始参与者,但我需要使用
actorOf
工厂方法将参与者正确连接到系统中:

class Supervisor extends Actor {

  def outputStateTrace(state: NodeState, data: NodeData, sender: ActorRef, msg: Any): Unit = { 
    /*actually make a binary log for analysis of complex failures*/
  }

  // COMPILE ERROR "follow this method with _ if you wan to treat it as a partially applied function" 
  var child = contact.actorOf(Props(classOf[FSMActorWithCallback], outputStateTracer) 

  // seems to work fine but not what i need
  val childRaw = new FSMActorWithCallback(tracer) 

}

actor的实际构造需要使用所示的factory方法,但我不知道如何通过factory方法传递回调

您传递的是一个方法而不是函数。编译器告诉您使用Eta扩展将其转换为函数

var child=contact.actorOf(Props(classOf[FSMActorWithCallback],outputStateTracer)

如下文所述:

因为我们已经引入了神奇的下划线作为 在功能中发现一些捷径的同时,杰克精通所有行业 定义,如果我们想启动eta的扩张,他会再次加入 因此,第二个选项是强制编译器强制 函数的第二种方法是显式引用 方法称为方法值,只需引用一些下划线即可 [在]方法名称之后(而不是方法参数)


你试过按照编译器的要求去做吗?欢迎来到Stack Overflow!虽然这可以从理论上回答这个问题,但在这里包含答案的基本部分,并提供链接供参考。确实。我问这个问题不是出于懒惰,而是因为要弄明白这一点的研究量似乎与其他pr不成比例过去遇到的问题,我希望接受一个答案,让下一个人在这页上清楚地知道如何做类似的事情。当然,链接到更详细的内容是很好的,但不是真正的回答问题,我用代码详细说明了这一点,以使其他人更容易遵循一个完整的结论,期待sni我会接受答案中的代码。谢谢!正如Ryan已经说过的,编译器错误已经回答了你的问题。
var child=contact.actorOf(Props(classOf[FSMActorWithCallback],outputStateTrace)
我假设outputStateTrace(r)是一个输入错误,同样outputSpaceTrace需要将int作为第一个参数来匹配Tracer的签名。如果你想了解google Eta扩展或查看之前的链接,可能不会要求投票,但既然我把你的答案说得很清楚,接受了它,并且投票了它,你能不能这么好心o投票赞成我的问题?:-)