5

来自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

我唯一能想到的是,第一个示例是有效的,因为除非ab更改,c不会重新计算,但在我的版本中,c每次调用时都会重新计算,c()但这只是大小 = 1 的记忆的特例,例如我可以这样做以防止使用记忆宏重新计算:

var a = 1; var b = 2
@memoize(maxSize = 1) def c(x: Int = a, y: Int = z) = x + y

关于反应式编程,我有什么遗漏的东西可以深入了解为什么在某些情况下它可能是一个更好的范例(比记忆闭包)?

4

1 回答 1

8

问题:这是一个不好的例子

网页上的示例并没有很好地说明 Scala.RX 的用途。从这个意义上说,这是一个非常糟糕的例子。

Scala.RX 有什么用?

这是关于通知

Scala.Rs 的想法是,当数据发生变化时,一段代码可以得到通知。通常,此通知用于(重新)计算取决于更改数据的结果。

Scala.RX 自动布线

当计算经过多个阶段时,很难跟踪哪个中间结果取决于哪些数据以及哪些其他中间结果。此外,必须以正确的顺序重新计算中间结果。

你可以把它想象成一个大的 Excel 表,其中必须包含相互依赖的公式。当您更改其中一个输入值时,Excel 必须弄清楚工作表的哪些部分必须以何种顺序重新计算。当 Excel 重新计算所有更改的单元格时,它可以更新显示。

Scala.RX 可以做与 Excel 类似的事情:它跟踪公式如何相互依赖,通知需要以正确顺序更新的公式。

目的:MVC

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 有一个新值:3
c 有一个新值:6
c 有一个新值:16
c 有一个新值:47

现在想象一下,您将刷新 UI 中的控件或 HTML 页面的某些部分,而不是打印值。

于 2014-06-30T08:13:44.107 回答