如何在Rust + WASM中返回向量的向量?

5lhxktic  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(178)

我想创建一个函数find,它接受一个Vec<Vec<isize>>类型的matrix参数,并返回另一个Vec<Vec<(usize, usize)>>类型的矩阵,不幸的是,wasm_bindgen抱怨类型不“兼容”。

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
  ^^^^^^^^^^^^ <- Error
pub fn find (matrix: Vec<Vec<isize>>, threshold: usize) -> Vec<Vec<(usize, usize)>> {
   // cut
}

错误

rustc: the trait bound `Vec<isize>: JsObject` is not satisfied
   the following other types implement trait `JsObject`:
     Array
     ArrayBuffer
     BigInt
     BigInt64Array
     BigUint64Array
     Boolean
     Collator
     CompileError
   and 47 others
   required because of the requirements on the impl of `FromWasmAbi` for `Box<[Vec<isize>]>`
3. rustc: the trait bound `Vec<(usize, usize)>: JsObject` is not satisfied
   the following other types implement trait `JsObject`:
     Array
     ArrayBuffer
     BigInt
     BigInt64Array
     BigUint64Array
     Boolean
     Collator
     CompileError
   and 47 others
   required because of the requirements on the impl of `IntoWasmAbi` for `Box<[Vec<(usize, usize)>]>`

在这种情况下使用什么函数签名?

zpf6vheq

zpf6vheq1#

我也有同样的问题我知道我没有解决你的直接问题,但是我解决我的问题的方法不是在vec中返回未定义大小的vec,而是使用js_sys将内部vec转换为Uint8Array。我能展示它的最好方法是这样。然后你可以用数组 Package 数组,这是我的猜测。据我所知,这是因为编译器需要知道未定义的usize不允许的数组大小。

use wasm_bindgen::prelude::*;
use js_sys;

    #[wasm_bindgen]
    pub fn find (matrix: Vec<Vec<isize>>, threshold: usize) -> Vec<js_sys::Uint8Array> {
       // cut
    }
wj8zmpe1

wj8zmpe12#

#[wasm_bindgen]
pub fn find(matrix: JsValue, threshold: usize) -> js_sys::Array{
    // cut
    let mut res: Vec<Vec<(usize, usize)>> = vec![
        vec![(1 as usize, 2 as usize)],
        vec![(2 as usize, 3 as usize)]];
    let mut ans:js_sys::Array = js_sys::Array::new();
    let matrix: Vec<Vec<isize>> = matrix.into_serde().unwrap_or(vec![]);

    // convert res to ans
    ans
}

相关问题