簡體   English   中英

RubyInline將VALUE數組從一個函數傳遞給另一個函數

[英]RubyInline passing VALUE array from one function to another

我正在嘗試將紅寶石數組從一個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])

我決定做些改變。 這就是我要使工作正常的方式。

我在/ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM