可變參數
在 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;