我有一个函数,用char比较2个字符串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数组。任何帮助表示赞赏!
答案 0 :(得分:9)
对于如何从C:http://rubycentral.com/pickaxe/ext_ruby.html
访问Ruby对象有一个很好的概述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])
希望这可以帮助你。
答案 1 :(得分: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
希望这也有助于:)