2017-09-22 138 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与反应式编程很少有关系,除了它的行为在多线程环境中定义良好之外。