首先在mruby中的所有数据类型都是mrb_value类型,然后通过具体的API可以转换成C的数据类型。
0. 字符串
ruby字符串的生成
MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
MRB_API mrb_value mrb_str_new_cstr(mrb_state*, const char*);
MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
如 mrb_str_new_lit(mrb, "example"); 生成"example"的ruby字符串。
将mrb_value的字符串转换成C字符串:
/* obslete: use RSTRING_PTR() */
MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value str);
1. 数字
如 mrb_value n_22 = mrb_fixnum_value(22) 生成 数字 22
2. Symbol
mrb_sym mrb_intern_cstr(mrb_state *mrb, const char* str);
# Ruby style:
* :pizza # => :pizza
*
* // C style:
* mrb_sym m_sym = mrb_intern_lit(mrb, "pizza"); // => :pizza
MRB_API mrb_sym mrb_intern_cstr(mrb_state *mrb, const char* str);
MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
* Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the
* symbol if it did not previously exist. See <code>Symbol#id2name</code>.
*
* "Koala".intern #=> :Koala
* s = 'cat'.to_sym #=> :cat
* s == :cat #=> true
* s = '@cat'.to_sym #=> :@cat
* s == :@cat #=> true
*
* This can also be used to create symbols that cannot be represented using the
* <code>:xxx</code> notation.
*
* 'cat and dog'.to_sym #=> :"cat and dog"
*/
MRB_API mrb_value
mrb_str_intern(mrb_state *mrb, mrb_value self)
{
return mrb_symbol_value(mrb_intern_str(mrb, self));
}
3. 数组
创建数组
flds = mysql_fetch_field(res);
fields = mrb_ary_new(mrb);
for (i = 0; i < res->field_count; i++) {
const char* name = flds[i].name;
mrb_ary_push(mrb, fields, mrb_str_new_cstr(mrb, name));
}
用法举例
class Nvr
CAMERAS = ["192.168.110.71", "192.168.110.72", "192.168.110.73", "192.168.110.74"]
end
那么如何在C代码取得常量数组中的IP列表呢?
RClass * NvrClass = mrb_class_get(mrb, "Nvr");
mrb_value cameras_arr = mrb_const_get(mrb, mrb_obj_value(NvrClass), mrb_intern_cstr(mrb, "CAMERAS"));
for (int i = 0; i < RARRAY_LEN(cameras_arr); i++) {
const char * ip = mrb_string_value_ptr(mrb, mrb_ary_entry(cameras_arr, i));
printf("IP:%s\n", ip);
}