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);