Scala中的并发参与者和特征

时间:2011-07-13 21:06:24

标签: scala inheritance actor traits mixins

民间,   我是Scala的新手,正在努力解决问题。我一直在搞乱特质,我真的很喜欢他们“混合”功能和界面的能力。我也一直在搞乱并发和Actors,我非常喜欢能够轻松地为高度复杂的并发系统建模的能力。

我遇到的问题是我无法找到结合两个世界的模式。我真正想要的是使用特征来确定Actor响应哪些类型的消息,允许跨继承层次结构的不同响应。

所以,使用战场模拟器的例子:我有Simulants,这是特征。战场上的所有物体都是模拟物,模拟物应该通过发送“乒乓”来响应“Ping” - 这就是它。我想要一个IFF特征,这将允许模拟人员将自己标识为消息发送者的朋友或敌人。另一个特征应该是Mobile,这意味着模拟物可以移动并且应该响应消息告诉模拟物它的新目的地。

正如您所看到的,我可能会:class Tank extends Actor with Simulant with IFF with Mobile,但我可能会遇到类似屏障的事情,例如class Barrier extends Actor with Simulant

我还没有做到的是创建act()方法,循环,反应等的正确组合,以使这种情况成为可能。简而言之,是否有可能“混合消息反应器”或者Scala是否限制我选择具有单继承的Actors或没有actor的mixins?

谢谢!

2 个答案:

答案 0 :(得分:2)

这个怎么样?

trait Simulant {
  def body: PartialFunction[Any, Unit] = {
    case Ping => reply(Pong)
  }

  def act = loop { react(body) }
}

trait IFF extends Simulant {
  override def body = super.body orElse {
    case FriendOrFoe => ...
  }
}

trait Mobile extends Simulant {
  override def body = super.body orElse {
    case Move(direction) => ...
  }
}
编辑:我刚刚试过这个,它编译好我:

aromanov@alexey-desktop:~$ scala
Welcome to Scala version 2.9.0.1 (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> object A {
     | import scala.actors.Actor
     | trait Simulant extends Actor {
     |   def body: PartialFunction[Any, Unit] = {
     |     case Ping => reply(Pong)
     |   }
     | 
     |   def act = loop { react(body) }
     | }
     | 
     | trait IFF extends Simulant {
     |   override def body = super.body orElse {
     |     case FriendOrFoe => {}  
     |   }
     | }
     | 
     | trait Mobile extends Simulant {
     |   override def body = super.body orElse {
     |     case Move(direction) => {}
     |   }
     | }
     | 
     | class Foo extends Actor with Simulant with IFF with Mobile
     | 
     | object Ping
     | object Pong
     | object FriendOrFoe
     | case class Move(direction: Int)
     | }
defined module A

另一方面,它实际上并不是工作:当我替换case Ping => println("pinged")时,我看不到它:

scala> (new A.Foo) ! A.Ping

scala>

答案 1 :(得分:0)

我做了一篇关于这个问题的博客文章以及我为解决这个问题而找到的妥协。

http://www.kotancode.com/2011/07/19/traits-multiple-inheritance-and-actors-in-scala/