Ruby内联 – 返回双值
require 'inline' class InlineTest inline(:C) do |builder| builder.c ' VALUE arr_distance(VALUE arr1, VALUE arr2){ long arr1_len = RARRAY_LEN(arr1); long arr2_len = RARRAY_LEN(arr2); if(arr1_len == 0 || arr2_len == 0){ return 0.0; } else{ long i, j; int count = 0; VALUE *c_arr1 = RARRAY_PTR(arr1); VALUE *c_arr2 = RARRAY_PTR(arr2); for(i = 0; i < arr1_len; i++){ for(j = 0; j 0
我使用上面的逻辑来计算我的匹配百分比。
以上示例代码打印0
。 我预计它会打印1.0
。
使用DBL2NUM
:
builder.c ' VALUE arr_distance(VALUE arr1, VALUE arr2){ long arr1_len = RARRAY_LEN(arr1); long arr2_len = RARRAY_LEN(arr2); if(arr1_len == 0 || arr2_len == 0){ return DBL2NUM(0.0); /* <------------ */ } else{ long i, j; int count = 0; VALUE *c_arr1 = RARRAY_PTR(arr1); VALUE *c_arr2 = RARRAY_PTR(arr2); for(i = 0; i < arr1_len; i++){ for(j = 0; j < arr2_len; j++){ if(rb_str_cmp(c_arr1[i], c_arr2[j]) == 0){ count++; } } } VALUE arr1_match = count/arr1_len; VALUE arr2_match = count/arr2_len; double match_percent = (arr2_match * 10 + arr1_match) / 11.0; return DBL2NUM(match_percent); /* <------------- */ } }'
- 不要直接返回
0.0
。 - 不要使用
VALUE
来存储C数值。