gettersetter

gettersetter 属性可以在 Rust impl 代码块中使用,以在 JS 中定义属性,这些属性的作用类似于字段的 getter 和 setter。 例如

#![allow(unused)]
fn main() {
#[wasm_bindgen]
pub struct Baz {
    field: i32,
}

#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(constructor)]
    pub fn new(field: i32) -> Baz {
        Baz { field }
    }

    #[wasm_bindgen(getter)]
    pub fn field(&self) -> i32 {
        self.field
    }

    #[wasm_bindgen(setter)]
    pub fn set_field(&mut self, field: i32) {
        self.field = field;
    }
}
}

可以在 JavaScript 中像此代码片段一样组合使用

const obj = new Baz(3);
assert.equal(obj.field, 3);
obj.field = 4;
assert.equal(obj.field, 4);

您还可以配置在 JS 中导出的属性的名称,如下所示

#![allow(unused)]
fn main() {
#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(getter = anotherName)]
    pub fn field(&self) -> i32 {
        self.field
    }

    #[wasm_bindgen(setter = anotherName)]
    pub fn set_field(&mut self, field: i32) {
        self.field = field;
    }
}
}

Getter 期望除了 &self 之外不接受任何参数,并返回字段的类型。Setter 期望除了 &mut self(或 &self)之外接受一个参数,并且不返回任何值。

getter 的名称默认从其附加的函数名推断而来。 setter 的默认名称是函数名减去 set_ 前缀,如果 set_ 不是函数的前缀,则不显式提供名称会报错。