如何获取运行函数的actor实例的引用?

时间:2012-03-21 22:51:42

标签: scala

我的程序结构如下:

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函数的actor实例中可用的额外函数。当我尝试使用this时,它指的是扩展的RunMe类。使用self只会导致not found: value self编译器错误。

我想做的是什么?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:1)

我想对你的代码提出几点意见:

  • functionmapvar和可变地图。通常你只需要它是一个或另一个;不是都。
    • 同样适用于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,您可以通过发送消息进行更改演员们。

答案 1 :(得分:0)

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

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

内部类的方法仅在该内部类的实例上可用,因此您需要从创建一些实例开始。

答案 2 :(得分:0)

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