2017-03-06 33 views
1

很久以前的工作,我比這個代碼獲悉:如何使用發件人ActorRef在阿卡

def doSome(ref: ActorRef, msg: AnyRef): Unit = { 
    ... some routine ... 

    ref ! msg 
} 

def receive = { 
    case x: Foo => doSome(sender(), x) 
} 

必須

... 

def receive = { 
    case x: Foo => 
    val s = sender() 
    doSome(s, x) 
} 

因爲發送者()是一個功能和之前適用有人會更改一個context.sender()值

問題1:是否有真正的非未來功能?或者像第一個變體一樣書寫是否安全?

問題2:有沒有什麼方法可以這樣寫?

def receive = { 
    case x: Foo => sendrer() {s => doSome(s, x)} 
} 
+0

你說的意思是「有沒有道理對非未來函數嗎?」你的演員裏面有一個能夠返回未來的功能嗎? – britter

回答

2

只要給定消息的接收行爲被執行,sender()的結果將保持不變。

因此,要回答你的第一個問題:是的,它是保存到做到像在第一變型,只要你

  1. 沒有指定由sender()你的演員內返回到字段的值
  2. 將該值傳遞給演員外的某個地方

但是,我不建議將sender()的結果分配給變量。而不是說,我建議叫sender()並直接發送消息(這將是我的回答對問題2):

def receive = { 
    case x: Foo => doSome(x) 
} 

def doSome(msg: Foo) = { 
    // your logic here 
    sender() ! msg 
}