大佬教程收集整理的这篇文章主要介绍了将C结构包装到Ruby,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Ruby代码,我想创建Person类的实例并在其中添加Address变量,这是另一个类:
require_relative 'my_extension' class Address def inspect "replaced #inspect: <Address: town:#{town}>" end end class Person def initialize puts "init" end def print() puts "Addr class #{@addr.inspect}" end end foo1=Person.new foo1.add_address("London") foo1.print foo2=Person.new foo2.add_address("Paris") foo1.print foo2.print foo1.print
C代码,扩展Ruby:
#include <stdio.h> #include "ruby.h" struct Address { char * town; }; static VALUE get_addr(VALUE self) { return rb_iv_get(self,"@addr"); } static VALUE wrap_address_get_town(VALUE self) { struct Address * address; Data_Get_Struct(self,struct Address,address); return rb_str_new2(address->town); } VALUE foo_class; VALUE address_wrapper_class; void free_m(){ printf("free\n");//just for test } void add_address_t(VALUE self,VALUE new_town){ printf("add_address\n"); /*init new struct and add value to it*/ struct Address addr; addr.town=stringvaluePtr(new_town); /*wrap struct*/ VALUE wrapped_address=Data_Wrap_Struct(address_wrapper_class,free_m,&addr); /*set it as instance variable*/ rb_iv_set(self,"@addr",wrapped_address); } static VALUE foo_class_alloc(VALUE self){ return self; } void Init_my_extension(){ foo_class = rb_define_class("Person",rb_cObject); address_wrapper_class = rb_define_class("Address",rb_cObject); rb_define_method(address_wrapper_class,"town",wrap_address_get_town,0); rb_define_method(foo_class,"add_address",add_address_t,1); }
@L_944_9@产生意外结果:
init Addr class replaced #inspect: <Address: town:London> init Addr class replaced #inspect: <Address: town:Paris> //London expected Addr class replaced #inspect: <Address: town:�)> //another problem Addr class replaced #inspect: <Address: town:�)> run run free free
以上是大佬教程为你收集整理的将C结构包装到Ruby全部内容,希望文章能够帮你解决将C结构包装到Ruby所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。