19

次のように整数の配列を渡すことができます。

const js = import("./webassembly_rust");
let array_nums = [1,2,3,4,5,6,7,8,9];

js.then(js => {
  js.test( array_nums );
}); 

WebAssembly に保存し、次のようなベクターに保存します。

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[wasm_bindgen]
pub fn test(array: JsValue) {
    let elements: Vec<u32> = array.into_serde().unwrap();
}

次のように単一のオブジェクトを渡すこともできます。

const js = import("./webassembly_rust");
let jsObject = {name: "hello world", id: "99", parent_id: "11"};

js.then(js => {
  js.test( jsObject );
}); 

WebAssembly に追加し、次のElementような構造体として保存します。

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[derive(Serialize, Deserialize)]
pub struct Element {
    name: String,
    id: String,
    parent_id: String,
}

#[wasm_bindgen]
pub fn test(js_object: &JsValue) {
    let element: Element = js_object.into_serde().unwrap();
}

次に試したのは、次のようなオブジェクトの配列を渡すことです。

const js = import("./webassembly_rust");
let arrayOfObjects = [
  {name: "hello world", id: "99", parent_id: "88"},
  {name: "hello world2", id: "88", parent_id: "12"},
  {name: "hello world3", id: "77", parent_id: "88"}
]

js.then(js => {
  js.test( arrayOfObjects );
}); 

ElementWebAssembly に追加し、次のような構造体のベクトルとして保存します。

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[derive(Serialize, Deserialize)]
pub struct Element {
    name: String,
    id: String,
    parent_id: String,
}

#[wasm_bindgen]
pub fn test(js_objects: &JsValue) {
    let elements: Vec<Element> = js_objects.into_serde().unwrap();
}

これはコンパイルされますが、このコードを実行するとエラーが発生します。

func $__rust_start_panic (param i32) (result i32)
  unreachable
  unreachable
end

スクリーンショット_約束_拒否_エラー

次のように数値で満たされたオブジェクトの配列を渡します。

const js = import("./webassembly_rust");
let arrayOfNumObjects = [
    {name: 1, id: 2, parent_id: 3 },
    {name: 1, id: 2, parent_id: 3 },
    {name: 1, id: 2, parent_id: 3 }
]

js.then(js => {
  js.test( arrayOfNumObjects );
}); 

Element構造体に値のみが含まれている場合は、WebAssembly への変換が可能u32です。

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[derive(Serialize, Deserialize)]
pub struct Element {
    name: u32,
    id: u32,
    parent_id: u32,
}

#[wasm_bindgen]
pub fn test(js_objects: &JsValue) {
    let elements: Vec<Element> = js_objects.into_serde().unwrap();
}

String問題は構造体の型が原因のようElementです。

私は何を間違えましたか?

次の記事を見つけましたが、問題の解決策が見つかりません。

  • JsValueSerde を使用して任意のデータをシリアライズおよびデシリアライズする

    これは、JavaScript オブジェクトを構造体に変換する方法を説明していますが、オブジェクトの配列を構造体のベクトルに変換する方法は説明していません。

  • js_sys クレート

    このクレートにより、Rust で配列やオブジェクトなどの JavaScript 型を使用できますが、これは私が望んでいるものではありません。JavaScript の値を Rust の対応する値に変換したいと考えています。このクレートは、私が理解している限り、Rust でインラインで JavaScript を使用することのみを許可しています...そして、これは Rust だけを使用するほど高速ではありません。

  • githubの問題

4

1 に答える 1