我必须实现一个函数,该函数接收剩余字数的信号以计算颜色信号,即
我已按以下方式实施:
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
答案 0 :(得分:1)
在第一种方法中,remainingCharsCount()
被调用一次,用于评估模式匹配结果。
在第二种方法中,一切都发生在Signal
块内。
在Signal { block }
中,block
是在依赖关系发生变化时进行评估的代码。
依赖关系是由调用者内部使用的信号创建的。
例如:remainingCharsCount()
会将caller
,returned 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()
只被调用一次(当您声明信号时)。在第二个中,它被称为(通过框架),而某些东西已经发生了变化。