从 0.4 迁移¶
roplat 0.5 相对 0.4 是破坏性更新:资源改为独立的借用通道,#[hard] 改为 hard 节律,事件触发器的发送方式拆分,同一实例跨作用域只能在一处调用。crates.io 上更早的 0.2 系列没有这些接口。9 个核心包(roplat、roplat_macros、roplat_system、roplat_launch、roplat_build、roplat_cpp、roplat_cpp_msg、roplat_py、cargo-roplat)统一为 0.5.0。
对照表¶
| 0.4 写法 | 0.5 写法 |
|---|---|
fn process(&mut self, input),设备放在 Input/Output 里归还 |
type Resources = (Arm,),process(&mut self, input, (arm,): (&mut Arm,));图中 &mut arm >> node.resources.0 |
ResourceSlot、reclaim_input、资源返回边 |
删除;借用在调用结束时自动结束 |
| 依赖绑定的书写顺序排列同一资源的使用 | 补 a >> b.trigger; |
#[hard] let mut node = …; |
let mut step = once::<I, O>().hard();,以 move |x| { … } 进入 |
trigger.fire(event) |
节点内 try_fire(event) 或 fire_async(event).await;外部线程 fire_blocking(event);只需通知时用 create_signal() |
尾段读取内层节点 Ok(reach.output) |
让 reach 作为域的尾表达式,读 task.output |
| 外层绑定资源、分支内调用 | 在调用所在的作用域绑定资源 |
| 不借用资源的节点 | 也要写 type Resources = ();,process 增加第三个参数 _: () |
自定义 Rhythm::drive |
在 input 与 context 之间增加 resources 参数 |
新增¶
- 图内
if(含else if、if let、let x = if …)、match 守卫、闭包节点roplat::node::map。 - 任务节律
retry(n)、feedback(n, finished),以及once()。 create_signal():不等待、不分配的合并通知。cargo roplat graph:画出书写的图与规约后的调度树。
行为变化¶
- 只有根作用域的独立部分会
tokio::spawn;节律周期与 match 分支里的并发一律同任务 join。 - 调度与语句书写顺序无关;图中有环和会造成通道死锁的结构改为带位置的编译诊断。
- 资源顺序和被其他路径蕴含的数据边不再把串并结构的图切开。
- 嵌套节律每个调用位置复用一个停止作用域,周期内的嵌套域每周期不再分配;
ExecutionContext由 8 字节变为 16 字节。上一次 drive 的句柄不能停止新的 drive。 EventTrigger::fire删除:它在任何 Tokio 运行时内都会 panic。
迁移步骤¶
- 把依赖改为
roplat = "0.5.0",所有 roplat 系列包使用同一版本。 - 给每个
Node和Rhythm加上type Resources,补齐process/drive的资源参数。 - 把设备从 Input/Output 里拿出来,改成
.resources.N借用;删除归还相关的代码。 - 按编译诊断补
.trigger边、移动资源绑定、拆分重复的调用位置。 #[hard]改为 hard 节律,事件发送改为新方法。- 运行有限的无设备版本,在调用方断言结果、调用次数和保留的状态。