Scala 反应式编程和普通的旧闭包有什么区别?
示例来自: 上述版本如何优于:Scala 反应式编程和普通的旧闭包有什么区别?,scala,memoization,reactive-programming,frp,scala.rx,Scala,Memoization,Reactive Programming,Frp,Scala.rx,示例来自: 上述版本如何优于: var a = 1; var b = 2 def c = a + b println(c) // 3 a = 4 println(c) // 6 我能想到的唯一一件事是,第一个例子是有效的,因为除非a或b更改,c不会重新计算,但在我的版本中,c每次调用c()但这只是大小为1的记忆的一种特殊情况,例如,我可以这样做,以防止使用: 关于反应式编程,有什么我不想探究的地方吗?它提供了一个洞察,为什么在某些情况下它可能是一个更好的范例(比记忆闭包更好?问题:这是一个糟糕
var a = 1; var b = 2
def c = a + b
println(c) // 3
a = 4
println(c) // 6
我能想到的唯一一件事是,第一个例子是有效的,因为除非a
或b
更改,c
不会重新计算,但在我的版本中,c
每次调用c()
但这只是大小为1的记忆的一种特殊情况,例如,我可以这样做,以防止使用:
关于反应式编程,有什么我不想探究的地方吗?它提供了一个洞察,为什么在某些情况下它可能是一个更好的范例(比记忆闭包更好?问题:这是一个糟糕的例子
网页上的示例没有很好地说明Scala.RX的用途。从这个意义上讲,这是一个相当糟糕的例子
Scala.RX是做什么用的?
是关于通知的
Rs的思想是,当数据更改时,一段代码可以获得通知。通常,此通知用于根据更改的数据(重新)计算结果
Scala.RX使布线自动化
当计算经过多个阶段时,很难跟踪哪个中间结果取决于哪个数据和哪个其他中间结果。此外,必须按正确顺序重新计算中间结果
你可以把它想象成一张很大的excel表格,其中必须有一系列相互依赖的公式。当您更改其中一个输入值时,Excel必须确定工作表的哪些部分必须按哪个顺序重新计算。当Excel重新计算所有更改的单元格时,它可以更新显示
Scala.RX可以做与Excel类似的事情:它跟踪公式之间的相互依赖关系,并通知需要按正确顺序更新的公式
目的:MVC
Scala.RX是实现MVC模式的一个很好的工具,特别是当您有业务应用程序时,您也可以将其带到excel中
还有一个与Scala.js一起使用的变体,即作为HTML站点的一部分在浏览器中运行。如果您希望根据服务器上的更改或用户的编辑动态更新HTML页面的某些部分,这将非常有用
局限性
Scala.RX在您有大量输入数据(例如,对大型矩阵的操作)时不会进行缩放
更好的例子
提供以下输出:
c has a new value: 3
c has a new value: 6
c has a new value: 16
c has a new value: 47
c有一个新值:3
c有一个新值:6
c有一个新值:16
c有一个新值:47
现在想象一下,您将刷新UI中的控件或HTML页面的部分,而不是打印值。Ah,我缺少了
c.foreach
部分。现在有道理了。我希望它被称为c.observe(旧值,新值)
。@wrick你肯定不是第一个,也不会是最后一个错过Scala.RX的人。我会尝试联系李浩毅(Scala.RX的开发者),并向他暗示你的问题。也许他会稍微更新一下介绍性示例。
var a = 1; var b = 2
@memoize(maxSize = 1) def c(x: Int = a, y: Int = z) = x + y
import rx._
import rx.ops._
val a = Var(1); val b = Var(2)
val c: Rx[Int] = Rx{ a() + b() }
val o = c.foreach{value =>
println(s"c has a new value: ${value}")
}
a()=4
b()=12
a()=35
c has a new value: 3
c has a new value: 6
c has a new value: 16
c has a new value: 47