Rust 特有语法糖
本页只介绍 darra_pns 独有的便捷写法。它们 不是新功能,只是把已有入口包装成更顺手的 Rust 写法(RAII 作用域、元组)。
可选,不用不影响标准入口 ——
connected()/state()/error_code()、read_int16/write_int16、read_struct/write_struct照常用。语法糖只是另一种写法。
crate ——
darra_pns。use darra_pns::PnSService;即可。没有sugar::session(&mut device)这个函数,入口是device.session()。
一、RAII 会话
创建即 start(),出作用域即 stop()。不 close(会话还在)。主站是不是在换周期数据,仍看 connected()。
| 写法 | 调用 |
|---|---|
| 标准 API | device.start()?; … device.stop()?; |
| 语法糖 | let _session = device.session()?; |
use darra_pns::PnSService;
fn main() -> darra_pns::ServiceResult<()> {
let device = PnSService::new();
{
let _session = device.session()?;
if device.connected() {
device.write_bool("Q0.0", true)?;
let _ = device.read_bool("I0.0")?;
}
} // 这里 stop,会话还在
Ok(())
}
session失败返回Err,不会留下半开的 start。- 不要
mem::forget,否则不会stop()。 #[must_use]:不绑定会立刻停。
何时用
- 临时开一段:用
session(),作用域结束必停。 - 一直跑:直接
start(),自己stop()。
二、元组
一行拆开连接态、运行状态、错误码。不是新状态源,只是把已有 getter 捆在一起。
取连接 + 状态
| 写法 | 调用 |
|---|---|
| 标准 API | let c = device.connected(); let s = device.state(); |
| 语法糖 | let (connected, state) = device.as_tuple(); |
let (connected, state) = device.as_tuple();
if !connected {
println!("{state:?}");
}
取连接 + 状态 + 错误码
let (connected, state, error) = device.as_tuple3();
if error != darra_pns::PnSRuntimeErrorCode::Ok {
println!("{}", device.error_message());
}
let _ = (connected, state);
何时用
- 日志 / 诊断循环:少写几遍
device.connected()、device.state()。
能力清单
| 分组 | 内容 |
|---|---|
| RAII 会话 | PnSService::session():创建即 start,Drop 即 stop,不 close |
| 运行态元组 | as_tuple() → (connected, state);as_tuple3() → (connected, state, error)。error 为 PnSRuntimeErrorCode |