我必须实现一个函数,它需要剩余字符计数的信号来计算颜色信号,即
- 如果还剩下 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/