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

时间:2019-07-28 16:31:03

标签: rust webassembly wasm-bindgen

如何将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方面仅处理大量计算。

1 个答案:

答案 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