本章主要介绍 Ruby Object 与C++对象绑定

//============================================================================
// Name : RubyCPP.cpp
// Author : frodo
//============================================================================ #include <iostream> #include <ruby.h> using namespace std; VALUE rb_print_value(VALUE obj){ VALUE str = rb_obj_as_string(rb_inspect(obj)); printf("%s\n", StringValueCStr(str));
return Qnil;
} VALUE rb_ext_p(int argc, VALUE* argv, VALUE thiz){ int i;
VALUE ret = Qnil; for (i = 0; i < argc; i++) {
rb_print_value(argv[i]);
}
if (argc == 1) {
ret = argv[0];
} else if (argc > 1) {
ret = rb_ary_new4(argc, argv);
}
if (TYPE(rb_stdout) == T_FILE) {
rb_io_flush(rb_stdout);
} return ret;
} class A{
public:
int v; public:
static A* create(){
A* a = new A();
return a;
}
void init(int _v){
this->v = _v;
} };
void wrap_A_free (A* ptr)
{
ruby_xfree(ptr);
} VALUE wrap_A_allocate (VALUE self)
{
void* p = A::create();
return Data_Wrap_Struct (self, NULL, wrap_A_free, p);
} VALUE rb_A_v(VALUE self){ A* a = NULL;
Data_Get_Struct(self, A, a); printf("%d\n", a->v); return Qnil;
} VALUE rb_A_initialize(int argc, VALUE* argv, VALUE self){ int v = FIX2INT(argv[0]);
A* a = NULL;
Data_Get_Struct(self, A, a);
a->init(v); return Qnil;
} void initExtKreal(){ rb_define_global_function("p", RUBY_METHOD_FUNC(rb_ext_p), -1); VALUE klassA = rb_define_class("A", rb_cObject);
rb_define_alloc_func(klassA, wrap_A_allocate);
rb_define_method(klassA, "v", RUBY_METHOD_FUNC(rb_A_v), 0);
rb_define_method(klassA, "initialize", RUBY_METHOD_FUNC(rb_A_initialize), -1); } int main() { ruby_init();
ruby_init_loadpath();
ruby_script("ruby-android");
initExtKreal(); int ret = 0;
rb_eval_string_protect(
"class A;"
"end;"
"a = A.new(100);"
"a.v;"
"a = nil;"
, &ret);; rb_eval_string_protect(
"GC.start;"
, &ret);; rb_p(rb_errinfo()); return 0;
}

绑定最基本的就是

Data_Wrap_Struct   包围一个数据到对象

Data_Get_Struct    从对象获取绑定数据

这2个函数了。

这个函数能够绑定 一个对象的数据。

然后还有一个就是

void rb_define_alloc_func(VALUE, rb_alloc_func_t);

这个函数了

主要相应的就是 一个Ruby 对象的物理内存声请和 释放。

第一个參数是 要绑定的对象, 通常是 rb_define_class 的返回值。

第二个就是一个函数指针。

在这个对象被 new 的时候 就会进到这里。我们能够在这里做物理的内存声请。

可是我这样写有个弊端。

就是參数无法传递进来。

做法是重定义 initialize 方法。 假设熟悉ruby 就应该知道这个是 一个对象是new后调用的,參数也在这里传递。

測试OK :)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

嵌Ruby 2 《捆绑》的更多相关文章

  1. linux安装nexus

    一.下载nexus 最新地址在:https://www.sonatype.com/download-oss-sonatype 我下载的是:nexus-2.14.1-01-bundle.tar.gz,是 ...

  2. 什麼是 mvc

    非常多的Web框架都實踐一個叫做MVC的軟體架構設計模式,將軟體分成三個部分: Model物件包裝了資料與商業邏輯,例如操作資料庫 View表示使用者介面,顯示及編輯表單,可內嵌Ruby程式的HTML ...

  3. 安装Maven、nexus

    一.软件包版本 jdk:jdk1.7.0_79 maven:apache-maven-3.3.3-bin.tar.gz nexus:nexus-webapp-2.8.0-05.war 二.安装mave ...

  4. ruby 基础知识(一)

    突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html    相信初学者会受益颇多 ruby  参考文档 ...

  5. Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  6. Ruby方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  7. ruby中symbol

    Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...

  8. DIY Ruby CPU 分析——Part I

    [编者按]原文作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是DIY Ruby CPU Profiling 的第 ...

  9. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

随机推荐

  1. Atitit.软件GUIbutton和仪表板(01)--警报系统--

    Atitit.软件GUIbutton和仪表板(01)--警报系统-- 1. 温度报警防区(鲁大师,360taskman) 1 2. os-区-----cpu_mem_io资源占用监測 1 3. Vm区 ...

  2. —教训深刻—SQL Server大约TempDB使用

    场景现象 中午查询了流水,因未与业务人员沟通好.忘了删选条件,导致TempDB不能分配空间,SQL Server高负载执行. 错误分析 我们来看看错误日志: 再来看看TempDB自增长记录: 事件 逻 ...

  3. 小谷的战斗Jquery(三)--水平和垂直菜单

    日薪的例子似乎有点低,今天做多.行,这种实现是一个简单的菜单,Web项目中,有两个共同的菜单:纵向和横向.说到从垂直,看原代码. html代码实现最主要的菜单与子菜单 <span style=& ...

  4. Nancy 框架

    Nancy 框架 Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE ,  GET ,  HEAD ,  OPTIO ...

  5. csdn仍是&quot;待定&quot;对?

    正如标题,我的博客会审查,?我们见证.如此反复.考虑到该博客平台的变化.              看来,这次最终逃脱被"待审核",看来再也不用受这个困扰了,希望以后CSDN可以在 ...

  6. 将android界面背景设置为黑色

    屏幕背景设置为黑色的几种方式: 新建项目时候 第二次next之后(不同sdk版本号可能不同),Background Color项点击可选. 开公布局文件,选择视图查看 就是下边二个选项卡中的第一个(G ...

  7. jedis异常:NoSuchElementException: Timeout waiting for idle object

    项目发现网络环境:java.util.NoSuchElementException: Timeout waiting for idle object 问题原因:不应该在try中释放资源.而应该在fin ...

  8. 为大型数据文件每行只能产生id

    为大型数据文件每行只能产生id 4个主要思路: 1 单线程处理 2 普通多线程 3 hive 4 Hadoop 搜到一些參考资料 <Hadoop实战>的笔记-2.Hadoop输入与输出 h ...

  9. 如何有效抓取SQL Server的BLOCKING信息

    原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...

  10. NSIS:卸载时选择组件

    原文 NSIS:卸载时选择组件 有时候,我们想要在卸载时也可以选择组件,进行定制性的卸载,那么,以下文字将简略讨论这个问题: 题外:我们想要卸载时选择组件,当然是在安装时要有组件选择页面的前提下,也就 ...