scala - scala 中信号的两种实现 - 一种在文本更改时触发事件,另一种则不触发

标签 scala functional-programming reactive-programming

我必须实现一个函数,它需要剩余字符计数的信号来计算颜色信号,即

  • 如果还剩下 15 个或更多字符,则颜色为“绿色”
  • 如果剩余 0 到 14 个字符(包括在内),则颜色为“橙色”
  • 否则(如果剩余计数为负),颜色为“红色”

我通过以下方式实现了这一点:

remainingCharsCount() match {
  case x if x < 0 => Signal("red")
  case x if x >= 14 =>  Signal("green")
  case _ =>  Signal("orange")
}

其中 remainingCharsCount: Signal[Int] 是文本中剩余字符的信号。

上述实现的问题在于,它不会根据剩余文本计数触发颜色更改事件。在其他实现中,我已将颜色变化的逻辑移至信号 block 内。

这段代码工作正常:

Signal {
  val rc = remainingCharsCount()
  if (rc >= 15) "green"
  else if (rc >= 0) "orange"
  else "red"
}

有人可以解释一下我在第一次实现中做错了什么吗?

欲了解更多信息,您可以引用此链接:https://github.com/ujjkumsi/FPDesign/blob/master/README.md

最佳答案

在第一种方法中,调用一次remainingCharsCount(),使用它来评估模式匹配结果。

在第二种方法中,一切都发生在 Signal block 内。 在 Signal { block } 中,block 是当依赖项发生变化时评估的代码。 依赖关系是由调用者内部使用的信号创建的。

例如:remainingCharsCount()调用者(即您案例中的返回的信号)添加到其观察者。

请参阅以下位置的 apply() 方法:https://github.com/omirho/scalafun2/blob/master/calculator/src/main/scala/calculator/Signal.scala

另请参阅其他方法实现。

让我再解释一下。 在方法 1 中:

remainingCharsCount() 被评估并被分配一个值。外部信号(在此代码中看不到,可以视为 nil)被添加到其观察者中。 然后该值用于模式匹配以构造常量Signal。 因此,未创建所需的依赖项。

方法 2 之前已经解释过。

关于scala - scala 中信号的两种实现 - 一种在文本更改时触发事件,另一种则不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47853602/

相关文章:

haskell - 功能证明(Haskell)

haskell - 在回合制 ascii 游戏中使用 FRP(尤其是响应式(Reactive)香蕉)是否有意义?

scala - 如何处理 monix onErrorHandle 中抛出的未处理异常

java - java中异步进程的技术和设计

xml - 为什么 XML 文字在 Scala 中产生可变对象?

java - Play Framework - 在开发模式下自动重新编译期间出现 NullPointerException

java - (合作)列表的差异与 Scala 中的堆栈不同?

functional-programming - "pivots"列表列表的类似 zip 方法的正确名称是什么?

java - Java 8 中 Collection<BiConsumer<A,B>> 的功能应用

scala - Scala 2.10中的新行为