问题标签 [ruby-c-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
243 浏览

ruby-on-rails - 如果库可用,则本机 C 扩展

我正在构建一个原生 C 扩展 Ruby gem 来生成唯一标识符(在此处找到)。如果可能的话,我希望库使用libuuid(通过 C 扩展)并回退到一个简单的 Ruby 实现。我目前有用于生成 UUID 的 C 和 Ruby 代码,但是我不知道如何配置成功的回退。有任何想法吗?

0 投票
1 回答
85 浏览

c - 为什么我的 C 扩展没有创建唯一实例?

我创建了一个 C 扩展,其目的是确定一系列牌是否会导致顺子。该示例可能比显示问题所需的复杂一些,但本质上 foo 应该在其中存储所有已评估的卡片(每个卡片都有一个分配的索引)。所以 bar 应该有一套完全独立的卡片和索引。但似乎当我开始将卡片分配给 bar 时,它正在覆盖 foo。我将在下面包含我的代码,以防我对指针做错了什么。

.h 文件

0 投票
2 回答
134 浏览

c - 如何不跨实例共享外部变量?

编辑:这是对问题的重写,因为它以前是如此不具体。

所以我在解决 C 扩展中跨实例共享变量的问题时遇到了问题。这是我遇到的一个例子。

下面代码中的最佳解决方案是简单地使用您可以设置的 ruby​​ 变量吗?

或者在 C 中是否有我没有看到或理解的解决方案?

代码:

0 投票
2 回答
674 浏览

c - 为什么没有分配 RARRAY_LEN?

我正在使用 C 扩展方法创建一个新的 ruby​​ 数组,但没有设置 RARRAY_LEN。难道我做错了什么?

输出:

0 投票
1 回答
514 浏览

c - 使用 c 扩展创建的对象可以相互实例化和管理吗?

现在我有一系列使用 C 扩展创建的对象,所以说它们是

  • 酒吧
  • 巴兹。

我有 ruby​​ 代码实例化它们三个,调用它们的函数并处理结果。让我们称之为:

  • 经理

好吧,现在 Manager 是我的瓶颈,所以我想把它变成一个 C 扩展。但我不知道如何从 Manager 中实例化 Foo、Bar 和 Baz。我是否必须使用如下代码:

然后调用如下方法:

还是有更清洁的方法?

0 投票
2 回答
101 浏览

c - 为什么我可以直接使用某些 ruby​​ C 扩展数组方法,而不能直接使用其他方法?

我正在使用在 ruby​​ 代码库的 array.c 中找到的许多数组方法,但是在尝试调用时

我收到了这个错误:

在我的代码的其他区域,我正在使用 rb_ary_sort_bang、rb_ary_clear、rb_ary_reverse 等。所以我不确定为什么 rb_ary_and 有什么不同。

0 投票
1 回答
141 浏览

c - 我在这个 C 扩展中引用我的实例的方式有问题吗?

我遇到了一些问题,如果我在 Rails 环境之外运行这个 C 扩展,它可以工作,但是当我在 Rails 内部运行时,它会给我一个堆栈转储。

我收到此错误消息:

这大概是指我在 EV::Counters 评估函数中进行的调用,以及我正在调用的三个实例中存在的“评估”函数。

奇怪的是 valgrind 没有给我任何错误。但是我认为我在引用实例的方式上可能做错了一些基本的事情?

0 投票
1 回答
339 浏览

c - 在 ruby​​ C 扩展中类型检查选项哈希值时的最佳实践是什么?

我正在为 ruby​​ 开发一个 C 扩展,我正在访问的 C 库中的一个函数接收一个选项结构,该结构似乎自然地转换为 ruby​​-world 中的选项哈希。

当 ruby​​ 端的哈希没有为给定选项定义值时,该结构正在使用已知的默认值进行初始化。在 C 方面,我有一些类似的内容:

现在我的问题是当一个选项有一个定义的值但 ruby​​ 类型在 C 中没有意义。

即使是可选值,我也应该引发类型错误吗?这似乎有点矫枉过正,我应该回退到默认值吗?回退到默认值的问题是传递 {"opt1" => 123 } 的用户会看到与未定义 opt1 相同的行为,这似乎是个坏主意,我应该回退并打印红宝石警告吗?(人们甚至读过它们吗?)。

0 投票
2 回答
3783 浏览

c - Ruby C 扩展 API 问题

所以,最近我不幸需要为 Ruby 做一个 C 扩展(因为性能)。由于我在理解方面遇到了问题VALUE(并且仍然存在),所以我查看了 Ruby 源代码并发现:(typedef unsigned long VALUE;Link to Source,但您会注意到还有其他一些“方法”可以完成,但我认为它本质上是一个long; 如我错了请纠正我)。因此,在进一步调查时,我发现了一篇有趣的博客文章,其中说:

“...在某些情况下,VALUE 对象可能是数据,而不是指向数据。”

让我感到困惑的是,当我尝试将字符串从 Ruby 传递给 C 并使用(从 RubyRSTRING_PTR();传递VALUE给 C 函数),并尝试用它“调试”它strlen();时返回 4。始终为4。

示例代码:

此示例始终返回 1 作为字符串长度:

有时在 ruby​​ 中,我看到一个异常说“无法将模块转换为字符串”(或类似的东西,但是我一直在弄乱代码,试图弄清楚我现在无法重现该错误当我尝试时会发生错误StringValuePtr();[我有点不清楚这到底是做什么的。文档说它将传递的参数更改为char*] on inp):

因此,有问题的 Ruby 代码是:MyMod::test("blahblablah")

编辑:修正了一些错别字并稍微更新了帖子。


问题

  1. 究竟是什么VALUE imp?指向对象/值的指针?价值本身?
  2. 如果它本身持有价值:它什么时候这样做,有没有办法检查它?
  3. 我如何实际访问该值(因为我似乎访问了 该值之外的几乎所有内容)?

PS:我对 C 的理解并不是最好的,但它还在进行中;此外,请阅读代码片段中的注释以获取更多描述(如果有帮助)。

谢谢!

0 投票
1 回答
152 浏览

c - c中ruby Exception类对象的扩展是什么?

嗨,我在 c 中有以下代码,它是从 ruby​​ 脚本调用的,

以下是 ruby​​ 客户端脚本的代码,

我从 ruby​​ 客户端调用 myMethod() 函数。谁能告诉我如何访问 c 文件中的异常类对象“exc”及其所有属性。