RubyInline - 比较字符串

时间:2013-11-07 05:01:47

标签: ruby string inline

我有以下内联C函数,它有助于比较两个数组。我必须将数组1中的每个元素与数组2进行比较并获得计数。

    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;
          VALUE 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(c_arr1[i] == c_arr2[j]){ //This comparison does not work
                count++;
              }
            }
          }
          return count;
        }            
      }'

如何比较两个字符串以检查它们是否与内联C代码相同?

1 个答案:

答案 0 :(得分:1)

使用RSTRING_PTR将Ruby字符串转换为C字符串,然后使用strcmp比较字符串相等性。

使用rb_str_cmp

require 'inline'

class Hello
  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 INT2NUM(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++;
              }
            }
          }
          return INT2NUM(count);
        }            
      }'
  end
end

p Hello.new.arr_distance(['1', '2', '3'], ['2', '4', '8', '1']) # => 2

不要忘记使用Fixnum将C int转换为Ruby INT2NUM

<强>更新

您还可以使用rb_str_equal

if (rb_str_equal(c_arr1[i], c_arr2[j])) ...