嵌Ruby 2 《捆绑》
本章主要介绍 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 《捆绑》的更多相关文章
- linux安装nexus
一.下载nexus 最新地址在:https://www.sonatype.com/download-oss-sonatype 我下载的是:nexus-2.14.1-01-bundle.tar.gz,是 ...
- 什麼是 mvc
非常多的Web框架都實踐一個叫做MVC的軟體架構設計模式,將軟體分成三個部分: Model物件包裝了資料與商業邏輯,例如操作資料庫 View表示使用者介面,顯示及編輯表單,可內嵌Ruby程式的HTML ...
- 安装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 ...
- ruby 基础知识(一)
突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html 相信初学者会受益颇多 ruby 参考文档 ...
- Ruby 方法
Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...
- Ruby方法
Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
- DIY Ruby CPU 分析——Part I
[编者按]原文作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是DIY Ruby CPU Profiling 的第 ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
随机推荐
- Lua Development Tools (LDT)
http://www.eclipse.org/ldt/ Lua Development Tools (LDT) is about providing Lua developers with an ID ...
- Netty+Tomcat热部署端口占用解决办法(转)
在eclipse使用maven deploy (tomcat:deploy) 热部署netty项目 ,项目启动的时候会报错端口被占用. java.net.BindException: Address ...
- SICP-2锻炼.34
[锻炼2.34] 为x给定值,找到一个多项式x的值,它也可以被形式化为累积. 下多项式的值: an*x^n + an-1*x^n-1 + .... + a1*x + a0 採用著名的Horner规则, ...
- RH133读书笔记(9)-Lab 9 Installation and System-Initialization
Lab 9 Installation and System-Initialization Goal: Successfully install Red Hat Enterprise Linux. Sy ...
- 它们的定义dialog
(1)你需要准备自己的自定义对话框样式,是一个布局文件 <?xml version="1.0" encoding="utf-8"? > <Li ...
- [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq
angularjs 使用ng-repeat报错 <div ng-init="words = ['高校','高校','高校']" ng-repeat="word in ...
- 缓存之EHCache(转)
一.简介非常简单,而且易用. ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,而且是hibernate 默认的缓存provider.ehcache 是一个纯Java的进程内 ...
- opencv-形态处理
开运算 (Opening) 原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/opening_closi ...
- net中使用ETW事件
在.net中使用ETW事件的方法 直到.net4.5,才有了比较便利的操作ETW的方法. 本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官 ...
- ASP.NET MVC常见问题解决方法
1.页面报错: The following errors occurred while attempting to load the app. - No assembly found containi ...