c - 如何使用 RubyInline 将 ruby​​ 数组转换为 C 数组?

标签 c ruby

我有一个函数,可以逐个字符地比较 2 个字符串。我需要它比在 Ruby 中运行得更快,所以我使用 RubyInline 重写了 C 中的函数。它确实将速度提高了大约 100 倍。该函数如下所示:

  require 'inline'

  inline do |builder|
    builder.c "
      static int distance(char *s, char *t){
        ...
      }"
  end

但是我需要比较 unicode 字符串。所以我决定改用 unpack("U*") 并比较整数数组。我无法从 RubyInline 的稀少文档中弄清楚如何将 ruby​​ 数组传递给函数以及如何将它们转换为 C 数组。感谢您的帮助!

最佳答案

这对如何从 C:http://rubycentral.com/pickaxe/ext_ruby.html 访问 Ruby 对象有一个很好的概述。

inline do |builder|
  builder.c "
    static VALUE some_method(VALUE s) {
      int s_len = RARRAY(s)->len;
      int result = 0;

      VALUE *s_arr = RARRAY(s)->ptr;

      for(i = 0; i < s_len; i++) {
        result += NUM2INT(s_arr[i]); // example of reference
      }

      return INT2NUM(result); // convert C int back into ruby Numeric 
    }"
end

然后在 ruby​​ 中你可以像这样传递值给它:

object.some_method([1,2,3,4])

希望这对你有帮助。

关于c - 如何使用 RubyInline 将 ruby​​ 数组转换为 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1117180/

相关文章:

android - 为什么填充这个数组会出现段错误?

c - 与控制台输出相同内容相比,为什么我的 C 程序的文件输出缺少最后几行?

c - 在 C 中使用 "Array"的字符串

ruby-on-rails - Rails 4 Has_many :through join association with select

ruby - 无法激活 aws-sdk-v1-1.67.0,因为 json-2.1.0 与 json (~> 1.4) 冲突 (Gem::ConflictError)

ruby - 使用 Aquarium 的 Ruby 异常处理中的 SystemStackError(面向方面​​的编程)

c - 开发一个用户定义的函数以非降序对数组进行排序

c - 如果#define 替换 errno 符号,线程安全的 errno 是如何初始化的?

ruby - 使用数组作为内部值创建一个 ruby​​ 嵌套哈希

ruby-on-rails - 无法在 Rails C 生产中加载数据库模型