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

时间:2009-07-12 23:19:10

标签: c ruby

我有一个函数,用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数组。任何帮助表示赞赏!

2 个答案:

答案 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

希望这也有助于:)