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
|
|
|
|
|
|
|
|
2020-09-22 11:57:56 +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 {
|
2020-09-22 11:57:56 +02:00
|
|
|
// 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()
|
|
|
|
}
|
|
|
|
|
2020-09-22 11:57:56 +02:00
|
|
|
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.**
|