Skip to Content

事件管线(Pipeline)

事件声明可以带 before / after / finally 三个管线段,把「发射前后」的规则写进频道本身:before 能改写载荷或取消派发,after 在派发后执行,finally 无条件执行。

三个段

event Order(id: string) { before { if id == "黑" { discard; } if id == "改" { resume "白"; } } after { print("[after] 派发完成"); } finally { print("[finally] 恒跑"); } }

发射时的执行序是:before → 派发 → after → finally。三种载荷各走一遍:

func OnOrder(id: string) { print("厨房收到", id); } Order ~> OnOrder; emit Order("白单"); print("---"); emit Order("黑"); print("---"); emit Order("改");
厨房收到 白单 [after] 派发完成 [finally] 恒跑 --- [finally] 恒跑 --- 厨房收到 白 [after] 派发完成 [finally] 恒跑
  • 白单直通:before 尾部自然结束等于放行,订阅者收到原载荷。
  • 黑被 discard; 拦下:派发与 after 全部跳过,只有 finally 恒跑。
  • 改被 resume "白"; 改写:订阅者收到的是改写后的载荷。

resume 与 discard 的规则

  • resume 改写载荷,实参必须携带全部载荷字段。
  • discard; 是续体段专用的语句软词,只在事件管线与 handle 臂体里合法。
  • after / finally 是纯执行段:里面不可以写 resume / discard。

event prop 的写位管线

事件属性的写入走同一条管线:before(可改写待写值 / 取消写入)→ 判变 → 存储 → after → 自动 emit → finally。段可以带显式参数表,按 (旧值, 新值) 绑定:

class Gauge { public event prop Level: int { before(oldV, newV) { if newV < 0 { resume 0; } } } }

resume 只改写新值位,discard; 同时取消写入与广播。显式参数表里旧值只读,不写参数表时用 setter 的 value 参名,机制与 prop 一致。

注意

  • 仅声明管线段(不写 get; / set;)即隐含自动 get;set,段一定会跑。
  • 管线体内可以 perform(免 uses 声明,运行时经 handler 栈解析),实例管线可访问 self。
  • 管线里 fail 的错误集自动收进发射点的义务:带管线的 emit 在调用侧要按 fail 契约消费或声明。
最后更新于 2026年10月10日