【问题标题】:Type safe Scala actors类型安全的 Scala 演员
【发布时间】:2011-08-14 04:32:21
【问题描述】:

有没有办法指定actor可以接受什么类型的消息,如果有任何东西试图发送其他类型的消息,则会给出编译错误?

【问题讨论】:

  • 啊,这绝对是有用的信息,谢谢!这个关于an excuse 的链接很有帮助,尽管我仍然不确定为什么嵌套接收默认需要无类型。似乎仍然可以使用类型来完成。
  • 至少从我读过的东西来看,显然 Scalaz 也输入了演员,所以......听起来答案是不要使用 scala.actors 中的演员,使用其他演员之一选项。

标签: scala actor


【解决方案1】:

不确定它是否回答了你的问题,但我希望它能给你一些想法。也许您正在从Akka 项目中搜索Typed Actors 之类的东西:

Typed Actors 是通过Typed Actors 实现的。它通过 AspectWerkz 使用 AOP 将常规 POJO 转换为具有 Actor 模型语义的异步非阻塞 Actor。例如。每个消息派发都会变成一条消息,放入队列中,由 Typed Actor 依次处理。

所以你定义了接口和实现,然后将它们注册为参与者。 Akka 将为您的界面创建代理,该代理仍然在引擎盖下使用演员模型。而且您仍然可以使用以下消息传递样式:

  • 一劳永逸
  • 请求-回复
  • 请求-回复-未来

【讨论】:

  • 虽然这确实符合我所说的,但它比我正在寻找的要多。我很好奇为什么选择让 Actors 接受任何对象来发送消息,而不是让 Actors 接受类型参数或其他东西,这样它就可以是类型安全的。
  • 发件人参考的类型是什么? case class DoSomething(forwardTo: Actor[X])
  • 我不是在谈论发件人引用的类型,只是输入消息类型。
  • 但是sender引用是一个ActorRef,它需要有输入类型的签名,那么sender引用的签名应该是什么,因为sender可以是任何ActorRef[_]
  • 如果我看对了地方,Actor.sender 是一个 OutputChannel[Any],所以它已经是一个参数化类型了。
【解决方案2】:

我认为答案在@mkneissl 所指的the post 中: “通常的做法是在 Actor 的伴生对象中声明 Actor 可以接收哪些消息,这样就更容易知道它可以接收什么。”

这样的例子会很有用......

【讨论】:

    【解决方案3】:

    虽然类型化的 Actor 确实在一定程度上解决了问题,但您必须记住,这仅提供部分静态类型安全性——您仍然默默地从一个无类型的 Actor 到一个由 typedActorOf(...) 键入的 Actor 进行动态转换调用,这就是动态蔓延和静态正确性丢失的地方——如果底层 ref 指向一个实际上不遵守类型化接口的参与者,那么你就有一个错误; Akka 不会尝试在运行时验证谁在“支持”类型化的 ref,因此类型化的消息最终会被发送给无法(正确)响应它们的参与者。

    总而言之,据我所知,使用 Akka 实现完全 (?) 静态类型安全的唯一方法是使用类型化通道:http://letitcrash.com/post/45188487245/the-second-step-akka-typed-channels

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2011-01-30
      • 2019-04-23
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多