2

如何将 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添加到世界之后,它立即失去了它的引用。

Console.log 结果:

body Body {ptr: 1118264}
index.js:28 after added Body {ptr: 0}

是否可以将引用存储在 JS 中?我的用例:我在 JS 端处理所有交互等,在 wasm 端只处理繁重的计算。

4

1 回答 1

0

当您运行时add_body,它会将值的所有权传递给您的 World,然后立即将其移动到 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

于 2019-08-27T00:34:09.747 回答