rhai/doc/src/rust/getters-setters.md

67 lines
2.2 KiB
Markdown
Raw Normal View History

2020-06-20 06:06:17 +02:00
Custom Type Getters and Setters
==============================
{{#include ../links.md}}
A custom type can also expose members by registering `get` and/or `set` functions.
2020-07-13 07:41:01 +02:00
Getters and setters each take a `&mut` reference to the first parameter.
2020-09-20 04:50:58 +02:00
Getters and setters are disabled when the [`no_object`] feature is used.
| `Engine` API | Description | Return Value of Function |
| --------------------- | ------------------------------------------------- | :-----------------------------------: |
| `register_get` | Register a getter | _Any_ |
2020-09-22 06:14:26 +02:00
| `register_set` | Register a setter | _None_ |
2020-09-20 04:50:58 +02:00
| `register_get_set` | Short-hand to register both a getter and a setter | _None_ |
| `register_get_result` | Register a getter | `Result<Dynamic, Box<EvalAltResult>>` |
2020-09-22 06:14:26 +02:00
| `register_set_result` | Register a setter | `Result<(), Box<EvalAltResult>>` |
2020-09-20 04:50:58 +02:00
Cannot Override Object Maps
--------------------------
Getters and setters are only intended for [custom types].
Any getter or setter function registered for [object maps] is simply ignored because
the get/set calls will be interpreted as properties on the [object maps].
2020-09-20 04:50:58 +02:00
Examples
--------
2020-06-20 06:06:17 +02:00
```rust
#[derive(Clone)]
struct TestStruct {
field: String
}
impl TestStruct {
// Remember &mut must be used even for getters
2020-06-20 06:06:17 +02:00
fn get_field(&mut self) -> String {
self.field.clone()
}
fn set_field(&mut self, new_val: &str) {
self.field = new_val.to_string();
2020-06-20 06:06:17 +02:00
}
fn new() -> Self {
TestStruct { field: "hello" }
}
}
2020-06-22 16:02:49 +02:00
let mut engine = Engine::new();
2020-06-20 06:06:17 +02:00
2020-07-12 05:46:53 +02:00
engine
.register_type::<TestStruct>()
.register_get_set("xyz", TestStruct::get_field, TestStruct::set_field)
.register_fn("new_ts", TestStruct::new);
2020-06-20 06:06:17 +02:00
let result = engine.eval::<String>(r#"let a = new_ts(); a.xyz = "42"; a.xyz"#)?;
println!("Answer: {}", result); // prints 42
```
2020-08-06 15:11:24 +02:00
**IMPORTANT: Rhai does NOT support normal references (i.e. `&T`) as parameters.**