嵌入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 《绑定》

时间: 2024-10-14 23:15:47

嵌入Ruby 2 《绑定》的相关文章

ruby 类库组成

一. 核心类库: 二.标准类库: 文本 base64.rb 处理Base64编码的模块     csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性     digest.so 消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja]     digest/md5.so     digest/rmd160.so     digest/sha1.so     digest/sha2.so     erb.rb 嵌入Ruby(

rails rake和示例

一篇看到的讲解得不错的文章 http://blog.csdn.net/clskkk2222/article/details/6735365 这里还有一些例子: Rake Documentation Rails Rake Tutorial Using the Rake Building Language ==================================================================================================

自动化管理工具puppet

Linux之puppet puppet简介 puppet是一套IT基础设施自动化管理工具,可以管理其整个生命周期,其官方网站:www.puppetlabs.org.其作者Luke Kanies成立了puppetLabs,于2005年发布0.2版本.puppet基于ruby语言研发,puppet有声明性.基于模型的配置语言,其也有自己的配置编程言. puppet的优势 基于master/agent的认证机制 不依赖于客户端系统的管理权限 可实现配置自动推送给客户端 puppet的版本 0.2 0.

开源应用架构之?Selenium WebDriver(上)

前不久,InfoQ向大家推荐了几本有关 软件架构的新书,引起了国内读者的广泛兴趣.其中一本是< 开源应用架构(The Architecture of Open  Source  Applications)>, 来自知名开源项目的各位作者对软件的设计进行了说明.通过对这些成功的系统架构进行概览,让软件工程师可以彻底了解最佳实践和陷阱.InfoQ中文站响应 读者的需求,整理了该书有关知名开源软件架构的精彩内容,供国内开发社区借鉴.本期介绍的是著名浏览器自动化工具Selenium   WebDriv

MVVM开源框架Knot.js 教程1 - CBS初步

CBS初步 学习Knot.js,实际上就是学习如何使用CBS.CBS使用和CSS类似的原理,将绑定逻辑从HTML中提取出来,大大地增加了系统的可维护性. 我关于Knot.js介绍的第一篇博文发表之后,有一位朋友敏锐地指出CSS设计的最重要目的之一就是复用,而CBS因为是对逻辑而不是样式的描述,复用性并不像样式那么强,那么CBS存在的意义又在哪里呢? 实际上CBS和CSS虽然原理类似,形式类似,但设计目的却很不一样. 绑定逻辑虽然复用性不如样式,但它会比样式复杂得多.在HTMLtag那么有限的空间

angular 自定义指令参数详解

restrict:指令在dom中的声明形式 E(元素)A(属性)C(类名)M(注释) priority优先级:一个元素上存在两个指令,来决定那个指令被优先执行 terminal:true或false,告诉angular是否停止执行比高优先级指令低的指令 template:两种形式,一种HTML文本:一个可以接受两个参数的函数,tElemetn和tAttrs,并返回一个代表模板的字符串.模板字符串必须存在一个根DOM元素 templateUrl:两种形式,一种代表外部HTML文件路径的字符串:一个

selenium webdriver (python)大全

webdriver的简介 硒2.0的主要新功能是集成的webdriver的API.webdriver的设计除了解决一些seleniumr-RC API的一些限制,与webdriver 的整合,将提供一个更简单,更简洁的编程接口.selenium webdriver会更好地支持动态的网页,页面本身被重新加载页面元素可能更改.webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持现代先进的web-app测试. WebDriver与Selenium-RC相比,是如何来驱动浏览器

puppet(4)-类、模版语言、模块

puppet(4)-类.模版语言.模块 代码重用: class, module 类 类是用于公共目的的一组资源,是命名的代码块,创建后可在puppet全局进行调用,类可以继承类是我们构建模块的基本组件 类:命名的puppet代码块,好处就是可以重复调用,需要时可通过名称进行调用: class my_class { ...puppet code... } puppet code: 包含变量赋值.各种条件判断语句.资源声明等等; 注意: 类的名字只能以小写字母开头 调用类: include clas

DevOps 系列工具之 Puppet 资源简介

资源清单 Puppet 可以管理的所有项目被称为 Puppet 资源.软件包.配置文件和服务都是 Puppet 所能管理的资源.资源指令组合为 Puppet 清单(Manifest)文件.资源是 Puppet 配置管理脚本(清单)的组成部分.资源又以下一些元素组成:类型:将要配置的资源类型(软件包.服务.文件等).资源类型有许多种.标题:配置管理脚本引用资源的方式属性:为资源指定的位置.不同资源类型有不同的属性提供者:与配置管理脚本引用资源方式相关的工具.通常不在资源陈述中说明.Puppet 根