我有一个函数,可以逐个字符地比较 2 个字符串。我需要它比在 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: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])
希望这对你有帮助。
关于c - 如何使用 RubyInline 将 ruby 数组转换为 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1117180/