我有兴趣在C语言中为ruby编写扩展时遵循正确的命名约定。具体来说,我指的是将_p添加到谓词的函数名称和前缀变量的内容,其中m代表模块, c代表类等。

例如,如果我们想在C中定义如下的谓词方法,我们应该在定义方法的函数中使用_p作为后缀。

class MyClass
  def awesome?
    true
  end
end

在C:

static VALUE my_extension_my_class_awesome_p(VALUE self) {
  return Qtrue;
}

void Init_my_extension(void) {
  VALUE cMyClass = rb_define_class("MyClass", rb_cObject);

  rb_define_method(cMyClass,
                   "awesome?",
                   my_extension_my_class_awesome_p,
                   0);
}

查看核心Ruby源代码,我看到_p (谓词)和_m后缀,我无法从中推断出含义。 我确信还有其他一些惯例。

还有其他命名约定,例如何时使用下划线以及何时使用骆驼外壳。 在编写具有大量C代码的扩展时,如果没有指导原则,就很容易造成混乱。

某个地方有明确的清单吗? 在谷歌搜索Ruby C扩展主题时,我似乎从未出现过有用的结果。 任何显示纯Ruby语法和正确命名的等效C函数的快速示例?

#1楼 票数:5 已采纳

以下是更多内容: http//geoffgarside.co.uk/2007/05/20/ruby-c-extensions-nested-modules-classes/

Geoff Garside有几十个以ruby / C编写的回购。 他是相当可靠的IMO。 https://github.com/geoffgarside

当我找到更多时,我会继续寻找更多并编辑这篇文章。

编辑

看起来很难找到想要谈论ruby扩展命名约定的人......也许你可以尝试在M. Garside的指导下发送推文/电子邮件。 他在推特上看起来非常活跃。

  ask by d11wtq translate from so

未解决问题?本站智能推荐:

2回复

将Ruby嵌入C并扩展

我有一个需要将Ruby代码嵌入C ++的要求(我可以实现这一点)并扩展一些功能。 当我尝试调用(要求)扩展模块时,程序失败。 我已经粘贴了以下代码的内容: main.cpp中 myRubyfile.rb 问题是如果我不使用require“ myMod”,则代码可以工
1回复

Ruby的专有C扩展

我已经用C编写了一些专有的业务逻辑,这些逻辑要从Ruby运行。 我试图将其编写为Bundler只是从主项目内部路径中包含的宝石。 但是,Bundler“在这种情况下不构建本机扩展”(在#bundler irc频道中为tmoore)。 我不想为此C扩展gem创建单独的私有存储库。 我也
1回复

有没有支持在Heroku上使用C扩展Ruby?

我试图快速计算Ruby中两个64位整数之间的汉明距离。 我很快发现即使使用Ruby的优化字符串函数等也是不够的,所以我转向C扩展。 相比之下,Pure Ruby基准测试每秒约350,000次比较,C扩展基准测试约为4,000,000。 我在这里使用了实现并在我的计算机上编译它,它工作正
1回复

编写C扩展到Ruby的好处

我是一名新的Ruby程序员,并且正在查看一些教程,用于编写Ruby语言的C代码扩展,我想知道:这样做有什么好处? 我个人正在考虑这个,因为我将来必须为一个班级做一个团队项目,我很确定我是唯一一个做Ruby开发的人,但大多数人都知道C所以我可以让他们写我理论上可以在我自己的Ruby开发中使用的C
1回复

C(Ruby扩展)中Alias模块的方法

我无法从元帅模块中使用别名方法“转储” 在红宝石中: 我该怎么做别名?
1回复

如何在Ruby扩展中链接C库

我正在构建一个相对简单的C扩展,以使用libpng计数PNG文件中的像素; 我用C构建了原始版本,并且可以使用以下命令在Cygwin中很好地编译(并且可以正常工作): gcc -o shadow_counter shadow_counter.c -lpng 如果我不包含“ -
2回复

如何从c扩展名访问ruby数组?

我收到这个错误 对于这条线 在这段代码中 我是否使用了不正确的self,并且rb_ivar_get实际上没有指向PairCounter类?
1回复

将事件循环从Ruby集成到C扩展中

我想知道如何将Ruby的事件循环与Ruby扩展集成到C语言中。我不确定这是否是执行我想做的事情的正确方法,所以我将解释问题。 我正在使用msgrcv和msgsnd (IPC),因此在Ruby C扩展和另一个应用程序之间发送消息。 问题在于,接收消息的扩展方法会创建一个无限循环,如下所示: