2011-12-09 16 views
5

我對Scala相當陌生。 我想了解當scala作爲消息的一部分傳遞給Actor時,如何進行動態綁定。與演員一起使用時的Scala變量綁定

我正在使用Akka 1.2和Scala 2.9。

我有以下代碼段(從http://gleichmann.wordpress.com/2010/11/15/functional-scala-closures/修改)

var minAge = 18 
val isAdult = (age: Int) => age >= minAge 

actor ! answer(19, isAdult) 
minAge = 20 
actor ! answer(19, isAdult) 

關於演員側,它只是適用isAdult於第一參數和輸出結果。 由於斯卡拉使用動態綁定(所以有人告訴我),我本來期望

true 
false 

,但不知結果是

false 
false 

所以這是真的,Scala是靜態綁定變量,並採取18作爲兩個答覆消息的minAge的值?有沒有辦法在消息中使用閉包時保持動態綁定行爲?

謝謝!

回答

9

你對閉包的理解是正確的。它正在做動態綁定,但是你正在引入併發問題。閉包綁定到可變數據,使閉包可變。演員模型只在演員間嚴格傳遞不可變數據時才解決併發問題。您可以按照看似時間順序編寫它,但演員調度程序會更改事件的順序。由於isAdult是可變的,所以重新排序會改變結果。

actor ! answer(19, isAdult) // message put in actor queue 
minAge = 20 
actor ! answer(19, isAdult) // message put in actor queue 
// later... 
// actor handles answer(19, isAdult) 
// actor handles answer(19, isAdult) 
+2

這是正確的,但請記住永遠不要這麼做;-)嚴重的是,如果你想在它們之間共享可變狀態,你將不會使用演員。不幸的是,Scala沒有提供關閉「按價值」的方法,因此您唯一能做的就是手動確保您關閉的所有內容都是「val」。 –

+0

我認爲這種說法在一臺機器上是正確的。但是對於遠程演員,爲什麼不呢?例如,我可以發送消息來同步兩個角色之間的分佈式狀態? – royalflush