将 Rust 在 JS 中实例化的结构存储在 wasm 端的 Rust 向量中



如何将 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

最新更新