来自scala.rx的示例:
import rx._
val a = Var(1); val b = Var(2)
val c = Rx{ a() + b() }
println(c()) // 3
a() = 4
println(c()) // 6
上述版本如何优于:
var a = 1; var b = 2
def c = a + b
println(c) // 3
a = 4
println(c) // 6
我唯一能想到的是第一个例子在某种意义上是高效的,除非a
或b
发生变化,c
不会重新计算,但在我的版本中c
每次调用c()
时都重新计算1}},但这只是memoization的一个特殊情况,大小= 1,例如我可以这样做以防止使用memoization macro重新计算:
var a = 1; var b = 2
@memoize(maxSize = 1) def c(x: Int = a, y: Int = z) = x + y
在某些情况下,是否有任何我想知道反应式编程的内容可以提供深入了解为什么它可能是一个更好的范例(而不是memoized闭包)?
答案 0 :(得分:8)
网页上的示例并没有很好地说明Scala.RX的用途。从这个意义上说,这是一个非常糟糕的例子。
Scala.Rs的想法是,当数据发生变化时,一段代码可以获得通知。通常,此通知用于(重新)计算取决于更改数据的结果。
当计算超过多个阶段时,很难跟踪哪个中间结果取决于哪个数据以及哪个其他中间结果。此外,必须以正确的顺序重新计算中间结果。
你可以把它想象成一个大的excel表,它必须是彼此依赖的公式。当您更改其中一个输入值时,Excel必须弄清楚,必须以哪个顺序重新计算工作表的哪些部分。当Excel重新计算了所有已更改的单元格时,它可以更新显示。
Scala.RX可以做与Excel类似的事情:它跟踪公式如何相互依赖,通知需要以正确顺序更新的公式。
Scala.RX是一个很好的工具来实现MVC模式,特别是当你有业务应用程序,你也可以带来excel。
还有一个适用于Scala.js的变体,即在浏览器中作为HTML网站的一部分运行。如果您想根据服务器上的更改或用户的编辑动态更新HTML页面的某些部分,这将非常有用。
当你有大量的输入数据时,Scala.RX不会缩放,例如:对巨大矩阵的操作。
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
现在想象一下,不是打印该值,而是刷新UI或HTML页面的部分控件。