Kaleidopink
V2EX  ›  Rust

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

  •  
  •   Kaleidopink · Sep 5, 2024 · 2869 views
    This topic created in 625 days ago, the information mentioned may be changed or developed.
        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 replies    2024-09-05 20:33:59 +08:00
    Kaleidopink
        1
    Kaleidopink  
    OP
       Sep 5, 2024
    尴尬了, 发现好像不对 `ev` 进行 variable shadowing 就可以了, 打扰了. V2EX 好像还不能删帖.
    bunny189
        2
    bunny189  
       Sep 5, 2024 via iPhone
    留着吧好哥哥,造福一下后来者
    omega3
        3
    omega3  
       Sep 5, 2024
    “你的水平还不够发现 xxx 的 bug”系列
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2778 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:18 · PVG 18:18 · LAX 03:18 · JFK 06:18
    ♥ Do have faith in what you're doing.