2017-09-22 98 views
0

正如我已經意識到,直到目前在斯卡拉功能反應式編程的基本思想是定義一個擴展DynamicVariable類斯卡拉的信號,但我不明白的東西寫在該類它說的解釋:Scala如何避免在反應式編程中競爭?

DynamicVariables提供了一種綁定機制,通過動態範圍找到當前值,但通過靜態範圍解析對變量本身的訪問。

如果我沒看錯的,動態範圍是當調用函數從調用程序的範圍內看到一個變量和靜態範圍時,看到從它自己的範圍,如僞碼的變量如下:

let x = 1 
    func dynamic (y: Int) = y + x 
    func static (w: Int) = y + x 
    func main() = { 
     let x = 2 
     dynamic (3) //returns 5 
     static (3) //returns 4 
    } 

所以,問題是如何訪問變量本身的意義,如果它意味着寫呢,怎麼斯卡拉防止賽車在某些功能有每個副本,並要寫入的變量?

回答

3

在下面,dv1以正常方式定義,並且只能通過通常的作用域規則訪問。功能checkDv1dv1,因爲dv1是在其範圍內定義的。

val dv1: DynamicVariable[Int] = new DynamicVariable(42) 

def checkDv1 = println(dv1.value) 

然而,當checkDv1withValue()動態範圍內調用時,它回來的值是不同的,如在這將是新綁定的值。

def testDv = dv1.withValue(41) { 
    checkDv1 
} 

checkDv1 
testDv 
checkDv1 

因此,來自這三個函數調用,輸出應爲:

42 
41 
42 

的動態範圍的變化。

對於您的其他問題,DynamicVariable在線程的上下文中具有綁定。當創建一個新線程時,當前綁定被複制到新線程中,並且它們之間沒有進一步的交互。因此,沒有競爭條件。

DynamicVariable與反應式編程很少有關係,除了它的行爲在多線程環境中定義良好之外。