为什么Akka没有CanTell特性/界面?

时间:2013-12-29 18:32:59

标签: akka

ActorRef有以下方法:

 final def tell(msg: Any, sender: ActorRef): Unit 
 def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit 

ActorSelection有以下方法:

 def tell(msg: Any, sender: ActorRef): Unit  
 def !(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit

这些方法是否不属于CanTell特性或其他类似的原因?我最近更改了一些代码来发送消息到ActorSelection而不是ActorRef。我认为如果我可以更一般地编写我的代码以接受我可以发送消息的任何内容,那将是很好的。

我从快照文档中得到了这个,但看起来它在2.2.3 api中是相同的。

3 个答案:

答案 0 :(得分:1)

这可能不是您问题的直接答案,但您可以使用其中一个scala功能,您可以通过以下方法定义可接受的类型:

def foo(a : {def length : Int}) { a.length}

如果创建了这样的特性,你不必改变你的大部分代码,但说实话,这对我来说看起来很丑陋:))

答案 1 :(得分:1)

这是使用隐式转换的解决方案。

trait CanTell {
  def tell: (Any, ActorRef) => Unit  
  def ! : (Any) => Unit
}

class CanTellRef(ref: ActorRef) extends CanTell {
  def tell = ref.tell _
  def ! = ref ! _
}

class CanTellSelection(ref: ActorSelection) extends CanTell {
  def tell = ref.tell _
  def ! = ref ! _
}

object CanTell {
  implicit def actorRef2CanTell(ref: ActorRef) = new CanTellRef(ref)
  implicit def actorSelection2CanTell(ref: ActorSelection) = new CanTellSelection(ref)
}

def doIt(actor: CanTell) = {
  actor ! DoSomething
}

答案 2 :(得分:0)

值得注意的是,在 Akka Typed API(弃用 ActorSelection 以支持向接待演员发送消息)中,ActorRefEntityRef(在集群分片中)和 { {1}}(来自测试套件)都扩展了 TestProbe,它实际上是 RecipientRef 接口(询问模式也由这些接口提供)。