Add userdata example
This commit is contained in:
parent
e4daff8c16
commit
c702c5eff2
|
@ -97,3 +97,7 @@ required-features = ["macros"]
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "serialize"
|
name = "serialize"
|
||||||
required-features = ["serialize"]
|
required-features = ["serialize"]
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "userdata"
|
||||||
|
required-features = ["macros"]
|
||||||
|
|
45
examples/userdata.rs
Normal file
45
examples/userdata.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use mlua::{chunk, Lua, MetaMethod, Result, UserData};
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
struct Rectangle {
|
||||||
|
length: u32,
|
||||||
|
width: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl UserData for Rectangle {
|
||||||
|
fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||||
|
fields.add_field_method_get("length", |_, this| Ok(this.length));
|
||||||
|
fields.add_field_method_set("length", |_, this, val| {
|
||||||
|
this.length = val;
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
fields.add_field_method_get("width", |_, this| Ok(this.width));
|
||||||
|
fields.add_field_method_set("width", |_, this, val| {
|
||||||
|
this.width = val;
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
|
||||||
|
methods.add_method("area", |_, this, ()| Ok(this.length * this.width));
|
||||||
|
methods.add_method("diagonal", |_, this, ()| {
|
||||||
|
Ok((this.length.pow(2) as f64 + this.width.pow(2) as f64).sqrt())
|
||||||
|
});
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
methods.add_meta_function(MetaMethod::Call, |_, ()| Ok(Rectangle::default()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
let lua = Lua::new();
|
||||||
|
let rectangle = Rectangle::default();
|
||||||
|
lua.load(chunk! {
|
||||||
|
local rect = $rectangle()
|
||||||
|
rect.width = 10
|
||||||
|
rect.length = 5
|
||||||
|
assert(rect:area() == 50)
|
||||||
|
assert(rect:diagonal() - 11.1803 < 0.0001)
|
||||||
|
})
|
||||||
|
.exec()
|
||||||
|
}
|
Loading…
Reference in a new issue