Tag: ruby c extension

如何从我的c扩展中访问ruby数组?

我收到了这个错误 ev.c:11: error: subscripted value is neither array nor pointer 这条线 printf(“%d\n”, pairs[0][0]); 在这段代码中 static VALUE EV; static VALUE PairCounter; static VALUE sort_pairs_2(VALUE self) { VALUE pairs; pairs = rb_ivar_get(self, rb_intern(“pairs”)); printf(“%d\n”, pairs[0][0]); return Qnil; } void Init_ev() { rb_eval_string(“require ‘./lib/ev/pair_counter'”); VALUE PairCounter = rb_path2class(“EV::PairCounter”); rb_define_method(PairCounter, “sort_pairs_2”, sort_pairs_2, 0); } 我是否正确使用自我,并且rb_ivar_get实际上并未指向PairCounter类?

如果gem安装不支持原生扩展,则回退到纯Ruby

我正在开发一个gem,它目前是纯Ruby,但我也一直在为其中一个function开发一个更快的C变种。 该function在纯Ruby中可用,但有时很慢。 缓慢只会影响一些潜在用户(取决于他们需要哪些function,以及他们如何使用它们),因此如果无法在目标系统上编译,那么让gem可以优雅地回退到仅使用Ruby的函数是有意义的。 我想在一个gem中维护该function的Ruby和C变体,并在安装时提供gem的最佳(即最快)体验。 这将使我能够从我的一个项目中支持最广泛的潜在用户。 它还允许其他人的依赖gem和项目使用目标系统上最好的可用依赖性,而不是兼容性最低的通用分母版本。 我希望在运行时回退的require出现在主lib/foo.rb文件中,就像这样: begin require ‘foo/foo_extended’ rescue LoadError require ‘foo/ext_bits_as_pure_ruby’ end 但是,我不知道如何让gem安装检查(或尝试和失败)本机扩展支持,以便gem安装正确,无论它是否可以构建’foo_extended’。 当我研究如何做到这一点时,我主要发现了几年前的讨论,例如http://permalink.gmane.org/gmane.comp.lang.ruby.gems.devel/1479和http://rubyforge.org/ pipermail / ruby​​gems-developers / 2007-November / 003220.html暗示Rubygem并不真正支持这一function。 没什么新鲜的,所以我希望SO上有人有一些更新的知识? 我的理想解决方案是在尝试构建扩展之前检测目标Ruby不支持(或者可能根本不希望在项目级别)C本机扩展的方法。 但是,如果不是太脏,尝试/捕获机制也可以。 这有可能,如果是这样的话怎么样? 或者建议发布两个gem变体(例如foo和foo_ruby ),我在搜索时发现,仍然是目前的最佳实践?