如何将 JS 实例化的对象存储在 Rust 的结构中并对其进行计算?
我根据教程创建了一个示例。
生锈部分:
#[wasm_bindgen]
pub struct Body {
position: f32
}
#[wasm_bindgen]
impl Body {
pub fn new() -> Body {
Body {
position: 0.
}
}
}
#[wasm_bindgen]
pub struct World {
bodies: Vec<Body>,
}
#[wasm_bindgen]
impl World {
// .. new etc
pub fn add_body(&mut self, object: Body) {
self.bodies.push(Body);
}
pub fn step(&mut step) {
// do something with bodies
}
}
const world = World.new();
const body = Body.new()
console.log('body', body);
world.add_body(body);
console.log('after added', body);
body
被添加到世界中后,它立即失去了参考。
控制台.log结果:
body Body {ptr: 1118264}
index.js:28 after added Body {ptr: 0}
是否可以将引用存储在JS中?我的用例:我在JS端处理所有交互等,只在wasm端处理繁重的计算。
当你运行add_body
时,它会将值的所有权传递给你的世界,这会立即将其移动到 vec 中。如果你想象在 rust 中使用相同的代码:
let mut world = World::new();
let body = Body::new();
println!("body: {:?}", body);
world.add_body(body);
println!("body added: {:?}", body);
它将无法在第二个 println 上编译,因为它是在add_body
调用中移动的。
如果你的对象主要存在于JS土地上,你应该在rust土地上作为JsValue引用使用它们。下面是可用作参考的 Array 全局绑定示例:https://rustwasm.github.io/wasm-bindgen/api/src/js_sys/lib.rs.html#127