Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 反应式编程和普通的旧闭包有什么区别?_Scala_Memoization_Reactive Programming_Frp_Scala.rx - Fatal编程技术网

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