pub async fn get_state(&self) -> (usize, bool) { let (tx, rx) = tokio::sync::oneshot::channel(); let ev = Event::GetState(tx); loop { let ev = match self.ev_q.put(ev).await { Ok(_) => break, Err(ev) => ev }; tokio::time::sleep(Duration::from_millis(20)).await; } rx.await.unwrap() }
不断调用一个函数 self.ev_q.put
, 该函数会获取参数 ev
的所有权. 如果成功则退出循环, 失败则函数会返回参数的所有权; 然后在下一次循环中再次调用. 但是发现 Rust 的 borrow checker 好像无法识别出来这个参数的所有权是始终存在的.
如果要实现的话只能写成这样:
pub async fn get_state(&self) -> (usize, bool) { let (tx, rx) = tokio::sync::oneshot::channel(); let mut ev = Some(Event::GetState(tx)); loop { let inner = match self.ev_q.put(ev.take().unwrap()).await { Ok(_) => break, Err(ev) => ev }; ev = Some(inner); tokio::time::sleep(Duration::from_millis(20)).await; } rx.await.unwrap() }
![]() | 1 Kaleidopink OP 尴尬了, 发现好像不对 `ev` 进行 variable shadowing 就可以了, 打扰了. V2EX 好像还不能删帖. |
2 bunny189 2024-09-05 18:21:03 +08:00 via iPhone 留着吧好哥哥,造福一下后来者 |
![]() | 3 omega3 2024-09-05 20:33:59 +08:00 “你的水平还不够发现 xxx 的 bug”系列 |