如何将嵌套 Vecs 与 wasm-bindgen 一起使用?

Posted

技术标签:

【中文标题】如何将嵌套 Vecs 与 wasm-bindgen 一起使用?【英文标题】:How do I use nested Vecs with wasm-bindgen? 【发布时间】:2019-03-17 05:06:25 【问题描述】:

嵌套的Vecs 似乎不适用于 wasm-bindgen。对吗?

我的目标是在 Rust 中创建一个可以作为行返回的 Game of Life 网格,而不是需要 javascript 来处理索引的一维 Vec。我想到的两种解决方法是:

    在 Rust 中实现一种自定义“迭代器”,这是一种逐一返回行的方法。 将一维数组交给 JavaScript,但在 JavaScript 中编写一个包装器来处理索引并向消费者公开某种迭代器。

我对使用其中任何一个都犹豫不决,因为我希望这个库可以被 JavaScript 和原生 Rust 使用,而且我认为在纯 Rust 领域中任何一个都不会是非常惯用的。还有其他建议吗?

【问题讨论】:

你试过使用嵌套切片吗? 也许你可以使用ndarray,但我不知道它是否适用于wasm。 【参考方案1】:

您说得对,wasm-bindgen 今天不支持返回类型,例如 Vec<Vec<u8>>

WebAssembly 的一个好的经验法则是,大块数据(如向量)应始终位于同一位置,以避免损失太多性能。这意味着您可能想要探索一个接口,其中 JS 对象将指针包装到 WASM 内存中,并且它的所有方法都使用行/列索引,但修改 WASM 内存以将其作为事实来源。

如果这不起作用,那么今天实现这一点的最佳方法也是您提到的策略之一,尽管这两个策略都需要编写一定程度的 JS 胶水代码。

【讨论】:

以上是关于如何将嵌套 Vecs 与 wasm-bindgen 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Wasm-Bindgen Web_sys Wasm-pack 将字符串从 Js 传递到通过 Rust 生成的 Wasm

java 如何将二维数组的一列作为参数传进去 求代码

通过与输入相同的提升图创建无向图

使用 wasm-bindgen 对大型 rust 对象进行 Js 绑定

在 WASM-Bindgen Rust 中使用鼠标输入事件闭包创建回调时出现闭包调用错误

前端每周清单:TensorFlow.js,深入了解wasm-bindgen