【发布时间】:2018-07-27 23:02:50
【问题描述】:
我目前正在开发一个高性能的 Vector/Matrix Ruby gem C 扩展,因为我发现内置的实现很麻烦,对于我个人遇到的大多数情况并不理想,并且在其他领域也缺乏。
我的第一个方法是在 Ruby 中作为 Fiddle::CStructEntity 的子类来实现,因为目标是使它们针对互操作进行优化,而无需进行转换(例如传递给原生 OpenGL 函数)。在 C 中实现为数学提供了很大的好处,但是在尝试实现一个次要函数时遇到了障碍。
我希望有一个方法返回一个Fiddle::Pointer 到结构体(基本上是一个指向Rdata->data 的指针。我希望返回一个实际的Fiddle::Pointer 对象。返回一个整数地址、打包字符串等很简单,并且使用它可以很容易地在 Ruby 方法中扩展以转换为 Fiddle::Pointer,如下所示:
def ptr
# Assume address is an integer address returned from C
Fiddle::Pointer.new(self.address, self.size)
end
这向我提出了一个问题,甚至可以从 C 中做到这一点吗? Fiddle 不是核心库的一部分,它是标准库的一部分,因此实际上只是一个扩展本身。
这个问题很简单,可以通过上面演示的几行 Ruby 代码轻松解决,但如果没有 hack 的 C 扩展甚至可以返回 Fiddle 对象,那就更好奇了?我找不到任何这样做的例子,而且在涉及 Fiddle 的文档中,它一如既往地非常基础,没有太多解释。
【问题讨论】: