4

Javascript にエクスポートされた 2 つの構造体があります。インスタンスを作成して JavaScript でエラーなく使用できますが、インスタンスを Rust 側のベクターにプッシュすると、「Uncaught Error: null pointer passed to rub」というエラーが発生します。

所有権が変更されるため、JS オブジェクトが null になるのはまったく正常なことですが、JavaScript 側で物事を変更するには、JavaScript オブジェクトを保持する必要もあります。

「vect」オブジェクトをnullにせず、変更できるようにする正しい方法はありますか?

実例を追加しました。ブラウザのコンソールにエラーが表示されます。

さびコード

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
struct Vector3 {
    x: f32,
    y: f32,
    z: f32,
}

#[wasm_bindgen]
impl Vector3 {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Vector3 {
        return Vector3 {
            x: 0.0,
            y: 0.0,
            z: 0.0,
        };
    }
    pub fn get_x(&self) -> f32 {
        self.x
    }
}

#[wasm_bindgen(extends = Object)]
struct Group {
    list: Vec<Vector3>,
}

#[wasm_bindgen]
impl Group {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Group {
        return Group { list: vec![] };
    }

    pub fn add(&mut self, vec: Vector3) {
        self.list.push(vec);
    }
}

JavaScript コード

let group = new Group();

let list = [];
for (let i = 0; i < 10; i++) {
  let vect = new Vector3();
  list.push(vect);
  group.add(vect);
}

setInterval(() => {
  for (let i = 0; i < list.length; i++) {
    const vect = list[i];
    console.log(vect.get_x());
  }
}, 1000);
4

1 に答える 1