我对Scala还是很陌生,所以这可能是一个琐碎的问题。我正在尝试在Akka中建立一个简单的项目,并且不确定如何处理需要存储对约束类型的actor的引用的情况。 假设我有演员特质
trait MyActorTrait extends Actor
然后在其他地方我想用成员定义另一个特征
def reference: ActorRef[MyActorTrait]
这显然是行不通的,因为ActorRef不在乎目标actor的类型(或者是吗?)。有什么方法可以约束reference
只接受对扩展MyActorTrait
的参与者的引用?
答案 0 :(得分:2)
根据设计,您无法通过Actor
访问底层的ActorRef
(或者几乎是任何其他方式)。因此,约束您描述的类型是没有意义的,ActorRef[Foo]
与ActorRef[Bar]
的处理方式绝对没有区别。
不用说,这是一件好事(Akka中很少有东西可以用IMO来表征),但这就是事实。
答案 1 :(得分:0)
尝试引用另一个演员中的演员的方法不正确。参与者形成一个层次结构。因此,它为您提供了一个介绍演员的途径。您可以使用以下三种主要方式来引用其他演员
context.actorSelection("/user/serviceA")
context.actorSelection("../brother") ! msg
context.actorSelection("../*") ! msg
您可以查看文档-https://doc.akka.io/docs/akka/2.5/general/addressing.html。
答案 2 :(得分:0)
经过一番挖掘,我相信我找到了一种方法。 首先,我创建一个特征以保留演员类型
-
然后实现一个通用应用,该应用实例化扩展特质的私人案例类
def trimEnd(s):
if ':' in s:
s = s[:s.index(':')]
if '-' in s:
s = s[:s.index('-')]
return s
a = 'ABCD: PQRS XYZ'
b = 'qwerty-asd zxc'
print(trimEnd(a))
print(trimEnd(b))
这样我就可以保留一个引用,该引用被限制为想要的类型的演员。
trait TypedActorRef[T <: Actor] {
def reference: ActorRef
type t = T
}
这对我来说似乎是可以的,至少这似乎不会使编译器感到不安,但是我不确定此解决方案是否阻止创建TypedActorRef的其他扩展,而这些扩展可能不遵循相同的约束。