mruby中数据类型C API

首先在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);
}

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值