【问题标题】:What is the difference between Reactive programming and plain old closures?反应式编程和普通的旧闭包有什么区别?
【发布时间】:2014-08-20 11:45:03
【问题描述】:

来自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() 但这只是 size=1 的记忆化的特例,例如我可以这样做以防止使用memoization macro 重新计算:

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

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

【问题讨论】:

    标签: scala memoization reactive-programming frp scala.rx


    【解决方案1】:

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

    网页上的示例并没有很好地说明 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 页面的某些部分,而不是打印值。

    【讨论】:

    • 啊,我错过了c.foreach 部分。现在有道理了。我希望它被称为c.observe(old_value, new_value) ...
    • @wrick 你肯定不是第一个也不会是最后一个错过 Scala.RX 要点的人。我会尝试联系 Li Haoyi(Scala.RX 的开发人员)并向他发送提示您的问题。也许他会稍微更新一下介绍性示例。
    猜你喜欢
    • 2016-05-27
    • 2015-08-21
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多