如何将JS实例化的对象存储在Rust的结构中并对其进行计算?
我基于tutorial创建了一个示例。
锈部分:
#[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
添加到世界后,它立即失去了引用。
Console.log结果:
body Body {ptr: 1118264}
index.js:28 after added Body {ptr: 0}
是否可以将引用存储在JS中?我的用例:我在JS方面处理所有交互操作,而在wasm方面仅处理大量计算。
答案 0 :(得分:0)
运行add_body
时,它将值的所有权传递给您的World,该World立即将其移到vec。如果您在rust中想象到相同的代码:
let mut world = World::new();
let body = Body::new();
println!("body: {:?}", body);
world.add_body(body);
println!("body added: {:?}", body);
由于它已在add_body
调用中移动,因此无法在第二个println上编译。
如果对象主要生活在JS领域,则应在rust领域中使用它们作为JsValue引用。这是一个数组全局绑定的示例,您可以用作参考:https://rustwasm.github.io/wasm-bindgen/api/src/js_sys/lib.rs.html#127