gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:04:51 26 4
gpt4 key购买 nike

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

  • 如果还剩下 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com