mrusty::mrusty_class!
[−]
[src]
macro_rules! mrusty_class { ( $name:ty ) => { ... }; ( $name:ty, { $( $rest:tt )* } ) => { ... }; ( $name:ty, $mrname:expr ) => { ... }; ( $name:ty, $mrname:expr, { $( $rest:tt )* } ) => { ... }; }
A macro
that comes in handy when defining an mruby Class
with Rust type reflection. It
automates and simplifies the implementation of the MrubyFile
trait
. Thus, any type provided
to mrusty_class!
will get an MrubyFile
implementation, unlike mruby_class!
which
implements a pure mruby class.
The macro takes a Rust type, an optional 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. "initialize"
is a special type of instance
method which require you to return an initialized type. Apart from this, all methods require
you to return a Value
. Apart from that, "initialize"
is the only method that doesn't
take itself as an argument.
Note: mruby
argument is optional.
use mrusty::{Mruby, MrubyFile, MrubyImpl}; let mruby = Mruby::new(); struct Cont { value: i32 }; mrusty_class!(Cont, "Container", { def!("initialize", |v: i32| { Cont { value: v } }); def!("value", |mruby, slf: (&Cont)| { mruby.fixnum(slf.value) }); }); Cont::require(mruby.clone()); // needs to be required manually 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, MrubyFile, MrubyImpl}; let mruby = Mruby::new(); struct Cont { value: i32 }; mrusty_class!(Cont, "Container", { def_self!("hi", |mruby, slf: Value| { mruby.string("hi") }); }); Cont::require(mruby.clone()); // needs to be required manually let result = mruby.run("Container.hi").unwrap(); assert_eq!(result.to_str().unwrap(), "hi");