如何使用RubyInline将ruby数组转换为C数组?

我有一个函数比较2个字符串char by char。 我需要它比在Ruby中运行得快得多,所以我使用RubyInline来重写C中的函数。它确实将速度提高了大约100倍。 该函数如下所示:

require 'inline' inline do |builder| builder.c " static int distance(char *s, char *t){ ... }" end 

但是我需要比较unicode字符串。 所以我决定使用unpack(“U *”)并比较整数数组。 我无法从一个简短的文档中找出RubyInline如何将ruby数组传递给函数以及如何将它们转换为C数组。 任何帮助表示赞赏!

这有关如何从C访问Ruby对象的一个​​很好的概述: http : //rubycentral.com/pickaxe/ext_ruby.html

 inline do |builder| builder.c " static VALUE some_method(VALUE s) { int s_len = RARRAY(s)->len; int result = 0; VALUE *s_arr = RARRAY(s)->ptr; for(i = 0; i < s_len; i++) { result += NUM2INT(s_arr[i]); // example of reference } return INT2NUM(result); // convert C int back into ruby Numeric }" end 

然后在ruby中你可以将值传递给它,如:

 object.some_method([1,2,3,4]) 

希望这可以帮助你。

给出上面答案的代码,这里是适用于Ruby 1.8.6 1.9.1的代码:

 inline do |builder| builder.c " static VALUE some_method(VALUE s) { int s_len = RARRAY_LEN(s); int result = 0; int i = 0; VALUE *s_arr = RARRAY_PTR(s); for(i = 0; i < s_len; i++) { result += NUM2INT(s_arr[i]); // example of reference } return INT2NUM(result); // convert C int back into ruby Numeric }" end 

希望这也有帮助:)