rust - 如何在不获取所有权的情况下从异步 block 更改变量值

标签 rust wasm-bindgen

我对rust还是很陌生,尝试使用rust和wasm-bindgen通过Web组件制作一个小型游戏。
我有一个事件监听器,它监听按键,并通过Stream返回方向。
然后我想根据direction变量的值每500毫秒在canvas元素上绘制一些内容。

我的问题是我无法从异步块中更改direction变量,
并在Interval闭包中使用它。

在异步块和Interval闭包中同时使用move关键字可以使代码进行编译,
但是方向永远不会在间隔函数内更改。
我认为方向变量随后将被复制到块/闭包中,因为Direction枚举实现了Copy特性。

我包括了入口点函数的简化版本:

#[wasm_bindgen]
pub fn run() -> Result<(), JsValue> {
    let mut direction = Direction::Right;

    let fut = async {
        let mut on_key_down = EventListenerStruct::new();

        while let Some(dir) = on_key_down.next().await {
            direction = dir;
          // ^^^^^^^^ this errors because direction does not live long enough
          // argument requires that `direction` is borrowed for `static`
        }
    };
    spawn_local(fut);

    Interval::new(500, || {
        // I want to use direction here
    })
    .forget();

    Ok(())
}

我的问题是;我可以将变量可变地借入异步块吗?
我可以在没有所有权的情况下使其生命周期足够长吗?

提前致谢,

最佳答案

是的,您可以使用Arc和Mutex进行此操作。

use std::sync::{Arc, Mutex};

fn main() {
    let mut direction = Arc::new(Mutex::new(Direction::Right));

    let direction2 = Arc::clone(&direction);
    let fut = async {
        let mut on_key_down = EventListenerStruct::new();

        while let Some(dir) = on_key_down.next().await {
            *direction2.lock().unwrap() = dir;
        }
    };
    spawn_local(fut);

    Interval::new(500, || {
        let direction = direction.lock().unwrap();
    })
    .forget();
}

关于rust - 如何在不获取所有权的情况下从异步 block 更改变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60919785/

相关文章:

loops - 如何在同一个向量上循环两次? [复制]

rust - 如何使 Rust Game of Life WebAssembly 作为静态网站工作?

arrays - 无法将迭代器转换为 js_sys::Array

syntax - `impl TraitX for TraitY` 在 Rust 中意味着什么?

rust - "cannot find macro"宏自身doc测试错误

rust - 为什么Arc <dyn Fn(dyn FnOnce(&mut [u8]),usize)-> Result <(),()> + Send + Sync>在编译时不知道syze

rust - 如何使用从变量类型推断出的长度来初始化数组?

javascript - 在 WebAssembly 中写入文件

node.js - 如何在 Rust 的 wasm_bindgen 函数中发出 HTTP 请求?

rust - 如何在WASM-Bindgen和Rust中实际获取响应正文的文本