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

y0u0uwnf  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(136)

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中是一样的。

tyg4sfes

tyg4sfes1#

也许这并不是直接回答你的问题,但是你可以使用scala的一个特性,在这里你可以通过has方法定义可接受的类型,例如:

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

如果创建了这样的特征,您不必更改太多代码,但老实说,这在我看来相当难看:)

os8fio9y

os8fio9y2#

下面是一个使用隐式转换的解决方案。

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
}
ev7lccsx

ev7lccsx3#

值得注意的是,在Akka Typed API中(不赞成使用ActorSelection,而支持将消息发送给接待员),ActorRefEntityRef(在集群分片中)和TestProbe(来自测试工具包)都扩展了RecipientRefRecipientRef实际上是CanTell接口(这些接口也提供ask模式)。

相关问题