pub trait UserData: Sized {
// Provided methods
fn add_fields<F: UserDataFields<Self>>(fields: &mut F) { ... }
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) { ... }
fn register(registry: &mut UserDataRegistry<Self>) { ... }
}
Expand description
Trait for custom userdata types.
By implementing this trait, a struct becomes eligible for use inside Lua code.
Implementation of IntoLua
is automatically provided, FromLua
needs to be implemented
manually.
§Examples
struct MyUserData;
impl UserData for MyUserData {}
// `MyUserData` now implements `IntoLua`:
lua.globals().set("myobject", MyUserData)?;
lua.load("assert(type(myobject) == 'userdata')").exec()?;
Custom fields, methods and operators can be provided by implementing add_fields
or
add_methods
(refer to UserDataFields
and UserDataMethods
for more information):
struct MyUserData(i32);
impl UserData for MyUserData {
fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
fields.add_field_method_get("val", |_, this| Ok(this.0));
}
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
methods.add_method_mut("add", |_, mut this, value: i32| {
this.0 += value;
Ok(())
});
methods.add_meta_method(MetaMethod::Add, |_, this, value: i32| {
Ok(this.0 + value)
});
}
}
lua.globals().set("myobject", MyUserData(123))?;
lua.load(r#"
assert(myobject.val == 123)
myobject:add(7)
assert(myobject.val == 130)
assert(myobject + 10 == 140)
"#).exec()?;
Provided Methods§
Sourcefn add_fields<F: UserDataFields<Self>>(fields: &mut F)
fn add_fields<F: UserDataFields<Self>>(fields: &mut F)
Adds custom fields specific to this userdata.
Sourcefn add_methods<M: UserDataMethods<Self>>(methods: &mut M)
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M)
Adds custom methods and operators specific to this userdata.
Sourcefn register(registry: &mut UserDataRegistry<Self>)
fn register(registry: &mut UserDataRegistry<Self>)
Registers this type for use in Lua.
This method is responsible for calling add_fields
and add_methods
on the provided
UserDataRegistry
.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.