跳到主要内容

Rust 特有语法糖

本页只介绍 darra_pns 独有的便捷写法。它们 不是新功能,只是把已有入口包装成更顺手的 Rust 写法(RAII 作用域、元组)。

可选,不用不影响标准入口 —— connected() / state() / error_code()read_int16 / write_int16read_struct / write_struct 照常用。语法糖只是另一种写法。

crate —— darra_pnsuse darra_pns::PnSService; 即可。没有 sugar::session(&mut device) 这个函数,入口是 device.session()


一、RAII 会话

创建即 start(),出作用域即 stop()。不 close(会话还在)。主站是不是在换周期数据,仍看 connected()

写法调用
标准 APIdevice.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 捆在一起。

取连接 + 状态

写法调用
标准 APIlet 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)errorPnSRuntimeErrorCode