![](/img/trans.png)
[英]RubyInline include another generated file to call a function from that file
[英]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.