本章主要介绍 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. 求n阶勒让德多项式

    Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 161  Solved: 105 [Submit][Status][Web Board] Descrip ...

  2. 【转】linux建立软链接

    实例:ln -s /home/gamestat    /gamestat linux下的软链接类似于windows下的快捷方式 ln -s a b 中的 a 就是源文件,b是链接文件名,其作用是当进入 ...

  3. Cordova探险系列(一个)

    最早接触PhoneGap平台是在1年多之前,可以使用HTML.CSS和JavaScript跨平台来编写Android或者IOS设备程序.而且应用的核心代码不须要多少改动就行移植.确实让我感觉的到它应该 ...

  4. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)(转)

    这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNU grep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解 ...

  5. HDU2159 研发费用背包

    主题链接:FATE 状态转移方程: dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num]) dp表示:当前忍耐度ren下杀敌数为num的经验值 ...

  6. RH253读书笔记(1)-Lab 1 System Monitoring

    Lab 1 System Monitoring Goal: To build skills to better assess system resources, performance and sec ...

  7. C和指针 (pointers on C)——第十一章:动态内存分配(下)习题

    1.编写calloc,内部用malloc. void *calloc (size_t n, size_t size) { char * memory; memory =(char*) malloc(n ...

  8. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  9. 阿里巴巴2014研发project师实习生面试经历

    java研发project师的初面是在上周三进行的,终于结果到了晚上才出,而没有通过的则是一结束网上就更新了状态.之后阿里通知这周三,也就是今天进行二面. 凑巧的是今早被舍友吵醒,中午那个困啊,但没时 ...

  10. android代码签名和混乱的包装

    研究了一下android的apk困惑签名和代码包装,假设没有混乱包.然后apk人们可以直接查看源代码反编译出来,尽管混乱包或能看懂.但不是那么容易理解,要求在至少一些时间 假设不混淆,反编译后的代码例 ...