如何阻止Barrage多次匹配一个模式?

时间:2015-09-29 19:36:40

标签: barrage

当我的温度计使用这种模式离线时,我正在尝试识别:

Pattern "missing temps" (temp : &float ∈ any):
     @temp is nil 5..;

它有效,但如果缺少超过5个值,我会为每个超过5的缺失值获得一个单独的匹配。

所以,如果我有:

  

50 50 nil nil nil nil nil nil nil 50 51

我得到3场比赛:

  没有,没有,没有。

     没有,没有,没有,没有。

     

nil nil nil nil nil nil nil

如果温度计长时间处于脱机状态,通知将完全失控。它为什么这样做?如何停止冗余匹配?

1 个答案:

答案 0 :(得分:1)

从Barrage的POV中,多次匹配并不是多余的;它通过重新启动每个值的模式匹配来做它应该做的事情。只是碰巧你的模式可以多次匹配同一系列的值。

但当然在这种情况下,这种行为并没有那么有用。这是一个简单的解决方法:

Pattern "missing temps" (temp : &float ∈ any):
    @temp is nil 5.. [longest];

[longest]告诉Barrage,一旦遇到最少连续五次 nil

  • 暂停考虑匹配的步骤'直到下一个事件被检查

  • 在下一个事件导致步骤失败之前,请勿完成步骤匹配。

所以对你的例子来说:

  

50 50 nil nil nil nil nil nil nil 50 51

在最长可能的 nil 值之后,该步骤才会匹配:

  

nil nil nil nil nil nil nil

如果你有20个连续的 nil 值,那么该步骤将不会匹配,直到它重复了所有20个 nil

所以只需将[longest]添加到步骤的末尾,您的模式应该按照您的意愿执行。