可變參數

在 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_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(variadic)]
    fn sum(args: &[i32]) -> i32;
}
#}

當我們呼叫此函式時,最後一個引數將會如 javascript 預期般展開。

若要將具有可變參數的 rust 函式匯出至 javascript,我們將使用相同的 bindgen 可變屬性,並假設最後一個引數將會是可變陣列。例如,以下 rust 函式


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen(variadic)]
pub  fn  variadic_function(arr: &JsValue) -> JsValue {
    arr.into()
}
#}

將會產生以下 TS 介面

export  function  variadic_function(...arr:  any):  any;