我对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/