我的程序结构如下:
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
编译器错误。
我想做的是什么?如果是这样,怎么样?
答案 0 :(得分:1)
我想对你的代码提出几点意见:
functionmap
是var
和可变地图。通常你只需要它是一个或另一个;不是都。
actorpool
。鉴于您提供的骨架,我假设您在初始化后不需要更改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
类型的,因此您要使用要调用方法的实例