wasm-bindgen Canvas示例中.map_err(|_| ())的作用咨询
wasm-bindgen Canvas示例中.map_err(|_| ())的作用咨询
嘿,我来帮你搞懂这个.map_err(|_| ())到底是干啥的!
首先,结合你给出的代码片段,你应该是在把获取到的通用Element转换成具体的HtmlCanvasElement,完整的代码逻辑大概是这样:
#[wasm_bindgen(start)] fn start() { let document = web_sys::window().unwrap().document().unwrap(); let canvas = document.get_element_by_id("canvas").unwrap(); let canvas: web_sys::HtmlCanvasElement = canvas.dyn_into().map_err(|_| ()).unwrap(); // 后续绘图逻辑... }
这里的dyn_into()方法会返回一个Result<HtmlCanvasElement, JsValue>:如果类型转换成功就返回目标元素,失败的话就返回包含底层错误信息的JsValue。
那.map_err(|_| ())的核心作用,就是把错误类型从复杂的JsValue转换成最简单的单元类型(),这么做主要有几个原因:
- 示例场景的简化处理:这个是入门示例,作者默认你页面上肯定存在id为
canvas的元素,而且它确实是canvas标签,错误情况几乎不会出现。用map_err(|_| ())就是把冗余的JsValue错误信息简化成最基础的(),再配合unwrap()直接拿到成功结果——就算真出错了,panic的提示也足够简洁,不会给新手带来额外的理解负担。 - 适配入口函数的要求:被
#[wasm_bindgen(start)]标记的函数是Wasm模块的启动入口,它不能返回Result类型,所有可能的错误都必须在函数内部处理掉。我们没法把错误向外抛出,所以要么用unwrap/expect这类方法直接终止程序,要么把错误转换成无关紧要的类型,这里用()就是最省事的选择。 - 隐藏不必要的底层细节:
JsValue里的错误信息偏向底层(比如DOM元素类型不匹配的具体原因),对于入门示例来说,用户不需要关心这些细节,只要知道“这里出错大概率是页面上的canvas元素有问题”就行,所以用()把复杂错误藏了起来。
如果是在实际项目里,你完全可以用expect("Failed to convert element to HtmlCanvasElement")来给出更明确的错误提示,不用非得用.map_err(|_| ())——这只是示例里一种偷懒但高效的错误处理方式而已~
备注:内容来源于stack exchange,提问作者Dacromir
相关产品推荐
相关产品推荐

