Trait rlua::prelude::LuaUserData

source ·
pub trait LuaUserData: 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.

Object Safety§

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§