在akka/scala中访问参与者之外的不可变成员

在akka/scala中访问参与者之外的不可变成员,scala,akka,immutability,actor,future,Scala,Akka,Immutability,Actor,Future,我刚开始学习Akka/Scala,并编写了一个小型聊天服务器 假设这是一个基于聊天室的服务器,每个人都可以创建自己的聊天室,并且可以同时在多个聊天室中。每当一个文件室的成员不足时,该文件室就会关闭。房间由id:Int标识,并具有不可变的名称:String。我写了下面的代码来展示这个房间 教室(val-id:Int,val-name:String,var-host:ActorRef)扩展了Actor{ def接收={ case GetId()=> 发件人!id case GetName()=> 发

我刚开始学习Akka/Scala,并编写了一个小型聊天服务器

假设这是一个基于聊天室的服务器,每个人都可以创建自己的聊天室,并且可以同时在多个聊天室中。每当一个文件室的成员不足时,该文件室就会关闭。房间由
id:Int
标识,并具有不可变的
名称:String
。我写了下面的代码来展示这个房间

教室(val-id:Int,val-name:String,var-host:ActorRef)扩展了Actor{
def接收={
case GetId()=>
发件人!id
case GetName()=>
发件人!姓名
案例添加成员(成员)=>。。。
案例移除成员(成员)=>。。。
案例广播消息(来自,消息)=>。。。
}
现在,客户机需要所有房间的ID和名称来决定加入哪个房间

val rooms:List[ActorRef]//从某处获得
val getIdFutures:List[Future[Int]=rooms.map{(?GetId()).mapTo[Int]}
val getNameFutures:List[Future[String]=rooms.map{(?GetName()).mapTo[String]}
val getIds:Future[List[Int]]=Future.sequence(getIdFutures)
val getNames:Future[List[String]=Future.sequence(getNameFutures)

对于(ids好吧,这只是我的观点。我认为你不应该按照你的建议去做,因为那样会使你的代码“多样化”(我的意思是,从参与者模型到更具体的东西)。从技术上讲,参与者不应该共享任何状态,而且,他们应该只对事件(消息)做出反应.在任何情况下,使用“理解”可将上述内容改写为:

for {
  room <- rooms
  id <- (room ? GetId).mapTo[Int]
  name <- (room ? GetName).mapTo[String]
} {
  println(id)
  println(name)
}
用于{

room反过来做怎么样?
case类ImmutableRoomData(id:Int,name:String)
Actor
中,然后您只需检索一次,就可以避免使用
zip
。此外,映射序列组合可以更简洁地编写为scalaz
traverse
@Imm,我认为ImmutableRoomData的思想与kaktusito提到的元组基本相同,但是
traverse函数
这是一个很好的观点!我应该使用它!