问题标签 [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.
ruby-on-rails - 如果库可用,则本机 C 扩展
我正在构建一个原生 C 扩展 Ruby gem 来生成唯一标识符(在此处找到)。如果可能的话,我希望库使用libuuid(通过 C 扩展)并回退到一个简单的 Ruby 实现。我目前有用于生成 UUID 的 C 和 Ruby 代码,但是我不知道如何配置成功的回退。有任何想法吗?
c - 为什么我的 C 扩展没有创建唯一实例?
我创建了一个 C 扩展,其目的是确定一系列牌是否会导致顺子。该示例可能比显示问题所需的复杂一些,但本质上 foo 应该在其中存储所有已评估的卡片(每个卡片都有一个分配的索引)。所以 bar 应该有一套完全独立的卡片和索引。但似乎当我开始将卡片分配给 bar 时,它正在覆盖 foo。我将在下面包含我的代码,以防我对指针做错了什么。
.h 文件
c - 如何不跨实例共享外部变量?
编辑:这是对问题的重写,因为它以前是如此不具体。
所以我在解决 C 扩展中跨实例共享变量的问题时遇到了问题。这是我遇到的一个例子。
下面代码中的最佳解决方案是简单地使用您可以设置的 ruby 变量吗?
或者在 C 中是否有我没有看到或理解的解决方案?
代码:
c - 为什么没有分配 RARRAY_LEN?
我正在使用 C 扩展方法创建一个新的 ruby 数组,但没有设置 RARRAY_LEN。难道我做错了什么?
输出:
c - 使用 c 扩展创建的对象可以相互实例化和管理吗?
现在我有一系列使用 C 扩展创建的对象,所以说它们是
- 富
- 酒吧
- 巴兹。
我有 ruby 代码实例化它们三个,调用它们的函数并处理结果。让我们称之为:
- 经理
好吧,现在 Manager 是我的瓶颈,所以我想把它变成一个 C 扩展。但我不知道如何从 Manager 中实例化 Foo、Bar 和 Baz。我是否必须使用如下代码:
然后调用如下方法:
还是有更清洁的方法?
c - 为什么我可以直接使用某些 ruby C 扩展数组方法,而不能直接使用其他方法?
我正在使用在 ruby 代码库的 array.c 中找到的许多数组方法,但是在尝试调用时
我收到了这个错误:
在我的代码的其他区域,我正在使用 rb_ary_sort_bang、rb_ary_clear、rb_ary_reverse 等。所以我不确定为什么 rb_ary_and 有什么不同。
c - 我在这个 C 扩展中引用我的实例的方式有问题吗?
我遇到了一些问题,如果我在 Rails 环境之外运行这个 C 扩展,它可以工作,但是当我在 Rails 内部运行时,它会给我一个堆栈转储。
我收到此错误消息:
这大概是指我在 EV::Counters 评估函数中进行的调用,以及我正在调用的三个实例中存在的“评估”函数。
奇怪的是 valgrind 没有给我任何错误。但是我认为我在引用实例的方式上可能做错了一些基本的事情?
c - 在 ruby C 扩展中类型检查选项哈希值时的最佳实践是什么?
我正在为 ruby 开发一个 C 扩展,我正在访问的 C 库中的一个函数接收一个选项结构,该结构似乎自然地转换为 ruby-world 中的选项哈希。
当 ruby 端的哈希没有为给定选项定义值时,该结构正在使用已知的默认值进行初始化。在 C 方面,我有一些类似的内容:
现在我的问题是当一个选项有一个定义的值但 ruby 类型在 C 中没有意义。
即使是可选值,我也应该引发类型错误吗?这似乎有点矫枉过正,我应该回退到默认值吗?回退到默认值的问题是传递 {"opt1" => 123 } 的用户会看到与未定义 opt1 相同的行为,这似乎是个坏主意,我应该回退并打印红宝石警告吗?(人们甚至读过它们吗?)。
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")
编辑:修正了一些错别字并稍微更新了帖子。
问题
- 究竟是什么
VALUE imp
?指向对象/值的指针?价值本身? - 如果它本身持有价值:它什么时候这样做,有没有办法检查它?
- 我如何实际访问该值(因为我似乎访问了除 该值之外的几乎所有内容)?
PS:我对 C 的理解并不是最好的,但它还在进行中;此外,请阅读代码片段中的注释以获取更多描述(如果有帮助)。
谢谢!
c - c中ruby Exception类对象的扩展是什么?
嗨,我在 c 中有以下代码,它是从 ruby 脚本调用的,
以下是 ruby 客户端脚本的代码,
我从 ruby 客户端调用 myMethod() 函数。谁能告诉我如何访问 c 文件中的异常类对象“exc”及其所有属性。