我正在通过一个发布者/订阅者模型的链接与一些硬件交谈。在 C++ 中,我使用 RAII 进行订阅以记住始终取消订阅,但我似乎无法在 rust 中获得所有权/借用权。
天真地,这就像我想做的事情。据我了解,send
可能receive
需要对.&mut self
Subscription
Transport
struct Transport;
impl Transport {
pub fn send(&mut self, cmd: &str) { unimplemented!() }
pub fn subscribe(&mut self, cmd: &str) -> Subscription {
self.send("subscribe-with-params");
Subscription { trans: &mut self }
}
}
struct Subscription {
trans: &mut Transport,
}
impl Drop for Subscription {
fn drop(&mut self) {
self.trans.send("unsubscribe-with params");
}
}
impl Subscription {
fn receive(&mut self) -> &[u8] { /*blocking wait for data*/ }
}
fn test(t: Transport) {
// Need to subscribe before command, as command might generate status messages
let mut status_sub = t.subscribe("status-message");
{
let mut short_lived_sub = t.subscribe("command_reply");
t.send("command");
short_lived_sub.receive(); // Wait for ack
}
loop {
println!("{:?}", status_sub.receive());
/*processing of status */
}
}
这里至少有两个问题。一个是Subscription
应该如何保留对它的“父级”的引用Transport
,另一个是fn test
我不能Transport
为两个不同的订阅借两次的问题。
我有一种感觉,我在这里问了一个错误的问题,所以也许有一种完全不同的方式来解决这个问题的好方法?