scala中信号的两个实现 - 一个触发文本更改的事件而另一个不触发

时间:2017-12-17 08:59:55

标签: 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]是文本中剩余字符的信号。

上面实现的问题是它不会根据剩余的文本计数触发颜色更改事件。在其他实现中,我已经在Signal块内移动了颜色变化的逻辑。

此代码可以正常工作:

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

有人可以在第一次实施中解释我做错了吗?

有关详细信息,请参阅此链接:https://github.com/ujjkumsi/FPDesign/blob/master/README.md

3 个答案:

答案 0 :(得分:1)

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

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

例如:remainingCharsCount()会将callerreturned Signal添加到您的案例中。

请参阅https://github.com/omirho/scalafun2/blob/master/calculator/src/main/scala/calculator/Signal.scala

中的apply()方法

另请参阅其他方法实现。

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

评估

remainingCharsCount()并将其分配给值。并且外部信号(在此代码中无法看到并且可被视为nil)被添加到其观察者。 然后将该值用于模式匹配以构造常量Signal。 因此,不会创建所需的依赖关系。

之前已经解释了方法2。

答案 1 :(得分:1)

我想你可以做到

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

信号需要表达式内的依赖项才能观察到变化。

答案 2 :(得分:0)

我无法访问您的链接。但是我记得Signal需要每次输入更改时执行的代码块。 在您的第一个方法remainingCharsCount()只被调用一次(当您声明信号时)。在第二个中,它被称为(通过框架),而某些东西已经发生了变化。