getter
and setter
The getter
and setter
attributes can be used in Rust impl
blocks to define
properties in JS that act like getters and setters of a field. For example:
#![allow(unused_variables)]
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;
}
}
}
Can be combined in JavaScript
like in this snippet:
const obj = new Baz(3);
assert.equal(obj.field, 3);
obj.field = 4;
assert.equal(obj.field, 4);
You can also configure the name of the property that is exported in JS like so:
#![allow(unused_variables)]
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;
}
}
}
Getters are expected to take no arguments other than &self
and return the
field's type. Setters are expected to take one argument other than &mut self
(or &self
) and return no values.
The name for a getter
is by default inferred from the function name it's
attached to. The default name for a setter
is the function's name minus the
set_
prefix, and if set_
isn't a prefix of the function it's an error to not
provide the name explicitly.