2016-06-17 3 views
1

Я хочу объявить глобальную переменную, когда актер получит какое-то сообщение, вот мой код, он работает. В: Могу ли я достичь этого с неизменяемой переменной?Scala akka: объявить глобальную переменную в функции приема

case class Start(configs:JobConfig) 
trait Job extends Actor with ActorLogging { 
    //use "val" instead 
    private var confMap:Map[String,String]=Map() 
    def receive = { 
    case Start(conf) => { 
     confMap = conf.properties 
     init() 
    } 
     case x => log.debug("Got: " + x) 
    } 

    final def getProperties():Map[String,String]={ 
    confMap 
    } 

    def init() 

} 

ответ

1

Конечно, вы можете, но если ваш init использования confMap он должен взять карту, как Parametr:

... 
def receive(confMap:Map[String,String] = Map()) = { 
    case Start(conf) => 
    init(conf.properties) 
    context.become(receive(conf.properties)) 
    case ... 

Вы можете найти более подробную информацию here

+0

Спасибо за ваш aswer. Но как использовать confMap в другой функции? Я не знаю, какая функция будет использовать confMap, что является основной причиной, по которой я объявляю глобальную переменную. –

+1

Если вы используете глобальные переменные, он создает побочный эффект. Трудно или иногда невозможно проверить свои функции изолированно. Итак, я думаю, что все ваши функции должны принимать 'confMap' в качестве параметра, или вы можете создать класс, который будет принимать конфиги в качестве параметра и иметь все необходимые вам методы и использовать его в параметре' receive'. –

+0

Я понял. спасибо –

Смежные вопросы