【发布时间】:2020-01-30 23:19:04
【问题描述】:
如果我使用接受 HtmlCanvasElement 的 wasm_bindgen 创建一个 Rust 函数,我如何确保它在到达 Rust 端时失败?
JavaScript:
(async () => {
const demo = await import('./pkg/demo').catch(console.error);
demo.setCanvas('Hello Element!');
})();
生锈:
use wasm_bindgen::prelude::*;
use web_sys::{console, HtmlCanvasElement};
#[wasm_bindgen]
pub fn setCanvas(canvas: &HtmlCanvasElement) {
// Why does this even get here? I didn't pass in an HtmlCanvasElement
console::log_1(&canvas);
}
看起来我得到了HtmlCanvasElement 类型,但如果我尝试将它用作HtmlCanvasElement,它没有这些功能,因为我传入的是字符串而不是实际的画布元素。我希望它在设置时失败,而不是在以后尝试使用它时失败。
【问题讨论】:
-
wasm_bindgen 中 DOM 和 Rust 的边界没有太多类型控制。我认为这是一个额外的库或框架的工作(可以很小,也可以是你自己的,你没有必须为此使用另一个板条箱)。
-
我什至不知道去哪里查看如何检查它是否确实是我的代码中的画布对象。
-
在大多数情况下,您可以使用
dyn_into(如this)进行检查 -
#[wasm_bindgen] pub fn setElement(canvas: HtmlCanvasElement) -> Result { match canvas.dyn_into::
() ... ...这看起来很奇怪将其转换为相同的类型 -
非常感谢您!虽然我不明白这里发生了什么,但它确实有效。你会建议我去哪里阅读更多关于内部工作原理的信息?
标签: rust wasm-bindgen