我被告知演员不应该传递字符串而只能传递对象。背后有什么理由吗?
以下代码片段对我来说似乎不错?有什么问题吗?
class MyActor extends Actor {
def onRecieve(): Unit {
case "xyz" => // do something
}
}
class Main {
// create a actor systesm
// create a worker of type MyActor
worker! "xyz"
}
答案 0 :(得分:1)
Scala中的字符串(实际上,java.lang.String)是对象。字符串还实现了java.io.Serializable,这是Akka对消息的要求。但一般来说,最好是Akka actor接收的是案例类或案例对象的消息。这是因为actor的receive()方法执行模式匹配,并且需要使用unapply()来解构对象。这是类提供的案例。对于大小写对象,您仍然可以在类型本身上进行模式匹配。当然,字符串文字上的模式匹配在技术上也应该起作用。
答案 1 :(得分:1)
字符串可能拼写错误,它们不能包含参数(除非您开始解析字符串),并且编译器无法检查缺失的情况。
要检查具有案例类的缺失案例,请将案例类消息全部扩展为密封特征,然后首先匹配特征,然后对特征的子类型进行嵌套匹配。如果你不处理特征的所有亚型,你应该收到警告。
但是,字符串确实可以作为消息正常工作。案例类有一些优点,但字符串可以工作。
答案 2 :(得分:0)
简短的回答是:是的,字符串是发送给 Akka actor 的完全有效的消息(当然,在 Akka Typed 中,这仅对 ActorRef[String]
、ActorRef[AnyRef]
、或 ActorRef[Any]
(或 ActorRef[T]
,因为存在从 String
到 T
的隐式转换可用):这三个中的至少两个非常奇怪......唯一可能的ActorRef[AnyRef]
或 ActorRef[Any]
的参数行为忽略每条消息)。
但是,请记住Alan Perlis's 34th epigram of programming:
<块引用>该字符串是一个严酷的数据结构,它被传递到的任何地方都有很多重复的过程。它是隐藏信息的完美工具。
为了从字符串中提取含义,通常必须对其进行解析:即使是高效的解析器也可能比跟踪对象图中的引用效率低,但这些解析器也通过强加一个沉重的认知来弥补这种低效率任何试图了解正在发生的事情的人都会感到负担。