V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kaleidopink
V2EX  ›  Rust

突然发现 Rust 没法正常表达这样一个场景.

  •  
  •   Kaleidopink · 110 天前 · 1873 次点击
    这是一个创建于 110 天前的主题,其中的信息可能已经有所发展或是发生改变。
        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()
        }
    
    3 条回复    2024-09-05 20:33:59 +08:00
    Kaleidopink
        1
    Kaleidopink  
    OP
       110 天前
    尴尬了, 发现好像不对 `ev` 进行 variable shadowing 就可以了, 打扰了. V2EX 好像还不能删帖.
    bunny189
        2
    bunny189  
       110 天前 via iPhone
    留着吧好哥哥,造福一下后来者
    omega3
        3
    omega3  
       110 天前
    “你的水平还不够发现 xxx 的 bug”系列
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:24 · PVG 03:24 · LAX 11:24 · JFK 14:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.