本章主要介绍 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. android中获取屏幕的信息

    获取屏幕信息比较简单,可以通过android的sdk自带的工具类DisplayMetrics.话不多说,上代码: // 获取屏幕的信息 DisplayMetrics dm = new DisplayM ...

  2. 阿里2015回顾面试招收学历(获得成功offer)

    1. 引言 继上次"百度2015校园招聘面试题回顾录(成功拿到offer)"文章过后,大家都希望除了题目之外.最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有參考价值 ...

  3. c# 判断字符是否是全角, 获取字符串的字节数 , 获取字符串指定长度字节数的字符串

    1 Encoding.Default.GetByteCount(checkString);  =2 全角 =1 半角 /// <summary> /// 获取字符串的字节长度 /// &l ...

  4. Linux查看命令终止进程

    Linux查看命令终止进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ba ...

  5. 讲座:html5于canvas疯狂的炮轰实现

    <html> <head> <title>坎农</title> <script src="../js/jscex.jscexRequir ...

  6. Android学习之RecyclerView

    RecyclerView是android-support-v7-21版本号中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本号,更加先进和灵活. 开发环境 - ...

  7. Ubuntu 14.04 grub2 温馨提示

    昨天win7在...的基础上,刚装几天发布Ubuntu14.04.Ubuntu14.04还是很不错的.但是,今天想去下一个Win7,但没有发现平时的开机显示grub2选项,直接进了Ubuntu! 我感 ...

  8. Ubuntu 当黑屏解决方案安装

    前几天我就已经安装Red hat 企业版,只是可惜它并没有提供数据源.我能够安装自己的软件,但我不能完全靠解决,因此,我们决定改变系统,最后我选择ubuntu.随时下载系统.然后用u盘制作启动盘,全部 ...

  9. Atitit.软体guibuttonand面板---通信子系统(范围)-- github 采用....

    Atitit.软体guibuttonand面板---通讯子系统(区)-- github 的使用.... 1. 1.注冊账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new ...

  10. decimal system 2016

    Problem Description As we know , we always use the decimal system in our common life, even using the ...