【问题标题】:Two implementation for signal in scala - one fires an event on text change and other doesnotscala中信号的两种实现-一种在文本更改时触发事件,另一种则不触发
【发布时间】:2018-05-30 22:02:58
【问题描述】:

我必须实现一个函数,该函数采用剩余字符数的信号来计算颜色信号,即

  • 如果还有 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

【问题讨论】:

    标签: scala functional-programming reactive-programming


    【解决方案1】:

    我猜你可以做到这一点

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

    信号需要依赖于它的表达式来观察变化。

    【讨论】:

    • @jwvh 谢谢,已修复
    【解决方案2】:

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

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

    例如:remainingCharsCount()callerreturned Signal 在你的情况下添加到它的观察者。

    参见apply() 方法:https://github.com/omirho/scalafun2/blob/master/calculator/src/main/scala/calculator/Signal.scala

    另请参阅其他方法实现。

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

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

    方法2之前已经解释过了。

    【讨论】:

      【解决方案3】:

      我无法访问您的链接。但是我记得Signal 会在每次输入更改时执行一段代码。 在您的第一种方法中,remainingCharsCount() 仅被调用一次(当您声明信号时)。在第二个中,它在某些事情发生变化时被调用(由框架)。

      【讨论】:

      • 感谢您的回答。我已经更新了链接。尽管如此,我还是不明白为什么在第一次实现中它只被调用一次。由于我正在更改字符并且我的剩余字符计数是信号,这将导致剩余字符计数()值发生更改,从而导致新的信号声明
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2015-03-21
      • 2014-08-26
      • 2015-08-19
      相关资源
      最近更新 更多