Trait UserData

Source
pub trait UserData: Sized {
    // Provided methods
    fn add_fields<'lua, F>(fields: &mut F)
       where F: UserDataFields<'lua, Self> { ... }
    fn add_methods<'lua, M>(methods: &mut M)
       where M: UserDataMethods<'lua, 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<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
        fields.add_field_method_get("val", |_, this| Ok(this.0));
    }

    fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
        methods.add_method_mut("add", |_, 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§

Source

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Self>,

Adds custom fields specific to this userdata.

Source

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Self>,

Adds custom methods and operators specific to this userdata.

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.

Implementations on Foreign Types§

Source§

impl<T> UserData for Rc<RefCell<T>>
where T: UserData + 'static,

Source§

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Rc<RefCell<T>>>,

Source§

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Rc<RefCell<T>>>,

Source§

impl<T> UserData for Rc<T>
where T: UserData + 'static,

Source§

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Rc<T>>,

Source§

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Rc<T>>,

Source§

impl<T> UserData for Arc<Mutex<T>>
where T: UserData + 'static,

Source§

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Arc<Mutex<T>>>,

Source§

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Arc<Mutex<T>>>,

Source§

impl<T> UserData for Arc<RwLock<T>>
where T: UserData + 'static,

Source§

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Arc<RwLock<T>>>,

Source§

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Arc<RwLock<T>>>,

Source§

impl<T> UserData for Arc<T>
where T: UserData + 'static,

Source§

fn add_fields<'lua, F>(fields: &mut F)
where F: UserDataFields<'lua, Arc<T>>,

Source§

fn add_methods<'lua, M>(methods: &mut M)
where M: UserDataMethods<'lua, Arc<T>>,

Implementors§