scala – Reactive编程和普通旧封闭有什么区别?
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,但这只是一个特例memoization的大小= 1,例如我可以这样做以防止使用memoization macro进行重新计算: var a = 1; var b = 2 @memoize(maxSize = 1) def c(x: Int = a,y: Int = z) = x + y 在某些情况下,是否有任何我想要了解反应性编程的内容,以便深入了解为什么它可能是一个更好的范例(而不是memoized闭包)? 解决方法
问题:这是一个糟糕的例子
网页上的示例没有很好地说明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 doe不会缩放,例如:对巨大矩阵的操作. 一个更好的例子 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页面的部分控件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |