Macro mrusty::mruby_class [] [src]

macro_rules! mruby_class {
    ( $mruby:expr, $mrname:expr ) => { ... };
    ( $mruby:expr, $mrname:expr, { $( $rest:tt )* } ) => { ... };
}

A macro that comes in handy when defining a pure mruby Class. It lets you define and control pure mruby types and returns the newly defined Class, unlike mrusty_class! which also handles Rust types.

The macro takes an mruby MrubyType, an mruby Class name, and a block as arguments. Inside of the block you can define mruby methods with the def! and def_self! helpers which are not visible outside of this macro.

def! and def_self! are analogous to mrfn! which has more usage examples.

Examples

Use def! to define mruby instance methods.

Note: mruby argument is optional.

use mrusty::{Mruby, MrubyImpl};

let mruby = Mruby::new();

mruby_class!(mruby, "Container", {
    def!("initialize", |mruby, slf: Value, v: i32| {
        slf.set_var("value", mruby.fixnum(v));

        slf
    });

    def!("value", |mruby, slf: Value| {
        slf.get_var("value").unwrap()
    });
});

let result = mruby.run("Container.new(3).value").unwrap();

assert_eq!(result.to_i32().unwrap(), 3);


Use def_self! to define mruby class methods.

Note: mruby argument is optional.

use mrusty::{Mruby, MrubyImpl};

let mruby = Mruby::new();

mruby_class!(mruby, "Container", {
    def_self!("hi", |mruby, slf: Value| {
        mruby.string("hi")
    });
});

let result = mruby.run("Container.hi").unwrap();

assert_eq!(result.to_str().unwrap(), "hi");


mruby_class! also works on mruby primitive types.

use mrusty::{Mruby, MrubyImpl};

let mruby = Mruby::new();

mruby_class!(mruby, "Fixnum", {
    def!("digits", |mruby, slf: i32| {
        if slf == 0 {
            mruby.array(vec![mruby.fixnum(0)])
        } else {
            let mut number = slf;
            let mut digits = vec![];

            while number != 0 {
                digits.push(mruby.fixnum(number % 10));

                number /= 10;
            }

            mruby.array(digits)
        }
    });
});

let result = mruby.run("123.digits.inject(:+)").unwrap();

assert_eq!(result.to_i32().unwrap(), 6);