2012-03-21 23 views
1

我有一个程序结构如下:如何获取对运行函数的actor实例的引用?

abstract class OuterClass 
{ 
    class InnerClass extends Actor 
    { 
     loop 
     { 
      react 
      { 
       case m: T => someFunction(m) 
      } 
     } 

     def someFunction(m: T) 
     { 
      ...search function map for specific function... 
      specificFunction() 
     } 

     ...extra methods here... 
    } 

    var functionmap=scala.sollection.mutable.Map.empty[String,()=>String] 
    var actorpool: ArrayBuffer[Actor]=new ArrayBuffer(0) 

    def main(args: Array[String]) 
    { 
     ...create X actors and add them to the pool... 
     populatefunctionmap 
    } 

    def populatefunctionmap() //defined elsewhere 
} 

class RunMe extends OuterClass 
{ 
    def populatefunctionmap() 
    { 
     ...add some functions to the map... 
    } 
} 

我的问题是,我想利用运行我functionmap功能演员实例中可用的额外功能。当我尝试使用this时,它指的是延伸RunMe类。使用self只会导致not found: value self编译器错误。

是我想做的可能吗?如果是这样,怎么样?

回答

0

如果我理解正确,你的问题与演员无关。它归结为:

abstract class Outer { 
    class Inner { 
    def innerf = 42 
    } 
} 

class RunMe extends Outer { 
    val inst = new Inner 
    def ref = inst.innerf 
} 

scala> (new RunMe).ref 
res0: Int = 42 
scala> val r = new RunMe 
scala> (new r.Inner).innerf 
res1: Int = 42 

内部类的方法只适用于该内部类的一个实例,所以你需要开始做一些实例。

+0

谢谢你的回答。我想我的问题可能不够清楚。在'main'方法中创建了许多actor实例。在稍后的时间点,一条消息将被发送到这些实例中的一个或多个 - 此时它将从'functionmap'运行一个函数。我希望能够从运行的函数中访问特定的actor的方法。对不起,我的问题不够清楚。 – Gareth 2012-03-22 09:02:33

1

几个百分点,我想使你的代码:

  • functionmap既是var和可变的地图。通常你只需要它是一个或另一个;不是都。
    • actorpool也一样。
  • 访问共享的,可变状态违反了actor模型的设计原则。

鉴于您提供的骨架,我假设您在初始化后不需要更改functionmap。而不是让它变成一个可变的var,使它成为不可变的val。 您可以通过摘要val(此处显示)或通过构造函数参数来实现。

abstract class OuterClass { 
    class InnerClass extends Actor { 
    def act() { 
     loop { 
     react { 
      case m: T => someFunction(m) 
     } 
     } 
    } 

    def someFunction(m: T) { 
     // ...search functionmap for specific function... 
     for (specificFunction <- functionmap.get(key)) { 
     specificFunction() 
     } 
    } 
    } 

    // abstract val 
    val functionmap: Map[String,() => String] 
    val actorpool: ArrayBuffer[Actor]=new ArrayBuffer(0) 

    def main(args: Array[String]) { 
    // ...create X actors and add them to the pool... 
    } 
} 

class RunMe extends OuterClass { 
    val functionmap = { 
    // ...build the function map... 
    } 
} 

如果您需要更改functionmap在创建角色后,再InnerClass需要有一个var持有自己functionmap,您可以通过发送消息给演员改变。

+0

感谢您的回答。在我的[实际代码](https://github.com/gazrogers/SWS/blob/master/server.scala)中,我确实有'actorpool'和'functionmap'作为'val's。当我将代码简化到我认为对于表达问题至关重要时,我只是犯了一个错误。我想我的问题还不够清楚,对此感到抱歉。 – Gareth 2012-03-22 08:58:56

+0

看完你的其他评论后,我想我明白了。您可以编辑您的问题以提高清晰度。 – leedm777 2012-03-22 13:45:07

0

如果您想从functionmap中的函数中访问InnerClass的方法,那么它应该是InnerClass => String的类型,因此您有要调用方法的实例。

相关问题