可变参数
在 JavaScript 中,函数参数的类型和数量都是动态的。例如
function sum(...rest) {
let i;
// the old way
let old_way = 0;
for (i=0; i<arguments.length; i++) {
old_way += arguments[i];
}
// the new way
let new_way = 0;
for (i=0; i<rest.length; i++) {
new_way += rest[i];
}
// both give the same answer
assert(old_way === new_way);
return new_way;
}
此函数无法直接转换为 Rust,因为我们目前不支持 wasm 目标上的可变参数。为了绑定它,我们使用切片作为最后一个参数,并将函数标记为可变参数
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { #[wasm_bindgen(variadic)] fn sum(args: &[i32]) -> i32; } }
当我们调用此函数时,最后一个参数将按照 JavaScript 的预期进行扩展。
为了将 Rust 函数导出到 JavaScript 并使用可变参数,我们将使用相同的 bindgen 可变参数属性,并假设最后一个参数将是可变参数数组。例如,以下 Rust 函数
#![allow(unused)] fn main() { #[wasm_bindgen(variadic)] pub fn variadic_function(arr: &JsValue) -> JsValue { arr.into() } }
将生成以下 TS 接口
export function variadic_function(...arr: any): any;