RubyInline将VALUE数组从一个函数传递到另一个函数

时间:2012-01-15 00:59:30

标签: c ruby

我正在尝试将ruby数组从一个C函数传递到另一个C函数但我一直收到以下错误

error: too few arguments to function ‘c_sum’

这是我的代码

require 'inline'

class ArrayMath


inline do |builder|

builder.c_singleton "
    static VALUE c_sum(VALUE arr){
    double result = 0;
    long i, len = RARRAY_LEN(arr);
    VALUE *c_arr = RARRAY_PTR(arr);

    for(i=0; i<len; i++) {
      result += NUM2DBL(c_arr[i]);
    }

return rb_float_new(result);
}"

builder.c_singleton "
static VALUE c_avg(VALUE arr){
    double sum, result, len = RARRAY_LEN(arr);

    // c_sum returns a ruby float
    sum = NUM2DBL(c_sum(arr));

    result = sum / len;

    return rb_float_new(result);
}"  

end


class << self
    alias sum c_sum
    alias avg c_avg
end
end

我在尝试

时遇到错误

ArrayMath.avg([2,3.4,5.24])

1 个答案:

答案 0 :(得分:0)

我决定稍微改变一下。以下是我开展工作的方式。

我在/ lib文件夹中创建了一个名为array_math.rb的文件(我在rails应用程序中使用它),它从application.rb初始化了

    config.after_initialize do
      require "#{Rails.root}/lib/arr_math.rb"
    end

这里是array_math.rb

class Array
require 'inline'

inline do |builder|
  builder.c <<-EOC
        static VALUE 
        rb_ary_sum(){
            double result = 0;
            long i, len     = RARRAY_LEN(self);
            VALUE *c_arr    = RARRAY_PTR(self);

    for(i=0; i<len; i++) {
      result += NUM2DBL(c_arr[i]);
    }

            return rb_float_new(result);
        }
    EOC


    builder.c <<-EOC
        static VALUE 
        rb_ary_avg(){
            double result = 0;
            double sum, len = RARRAY_LEN(self);

            sum = NUM2DBL( rb_ary_sum(self) );

            result =  sum/len;
            return rb_float_new(result);
        }           

EOC
end

def sum
    rb_ary_sum
end

def avg 
    rb_ary_avg
end 

end

现在我们可以这样做:

arr = [2,3,6.7,3.49]
arr.sum   => 15.19 
arr.avg   => 3.7975