Ruby C 绑定(bind)与系统调用的 Ruby 包装器

标签 ruby binding ruby-c-extension systemwrapper

Ruby C 绑定(bind)的执行与系统调用的 Ruby 包装器之间的主要区别是什么?

对于我的问题,我正在考虑将 Git 版本控制功能大量集成到 Ruby on Rails 应用程序中。在完成这项任务时,我不明白如何考虑 Ruby 程序的执行管道,该程序包含一个用 Ruby C 绑定(bind)实现的库,例如 yajl-ruby。与系统调用的 Ruby 包装器相比,例如 git Ruby Gem .

最佳答案

绑定(bind)直接与库的 API 交互,而包装器使用系统调用从命令行调用最终用户应用程序。

包装类似于 UNIX 管道——程序不知道彼此的内部结构并通过文本界面进行通信。不过,松耦合是有代价的。系统调用是昂贵的操作,会显着降低您的应用程序速度。

这就是绑定(bind)很棒的原因。由于他们使用库的编程接口(interface),开销显着减少。 GitHub 有自己的 git 包装器,和 speed was issue that led them to implement git in Ruby .

他们自己做了,因为为 git 做绑定(bind)有点困难。它并非设计用作图书馆。直接调用它的函数真的很尴尬,因为它会在几乎所有错误上调用 die()

对适当的 git 库的需求导致了 libgit2 的开发.它甚至带有 Ruby bindings !由于您想将 git 功能与您的应用程序集成,因此您应该检查一下。

关于Ruby C 绑定(bind)与系统调用的 Ruby 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10395995/

相关文章:

c - 如何检索从 ruby​​ 脚本传递的 C 中结构类型变量的结构成员?

ruby-on-rails - 如何在 ruby​​ 上的哈希中创建 deep_slice

ruby - 如何用 capybara 填写日期时间本地字段?

c# - Java 和 C# 处理方法绑定(bind)方式的显着差异背后的解释是什么?

WPF 将 TextBlock 绑定(bind)到窗口的标题

c - Ruby 全局解释器锁 (GIL) - rb_thread_call_without_gvl

jquery - 选项卡不会更改为 “active” - jQuery 和 rails 3

mysql - 使用模型搜索特定字段

c# - 是否可以使用指向基类型的 AncestorType 进行 WPF RelativeSource 绑定(bind)?

c - Ruby C API `defined? SomeConstant` 等效?