我正在尝试使用带 Ruby 的内联 C 重写一个高度递归的函数。该函数接受未定义数量的参数,即在 Ruby 中它看起来像这样:
def each_entity(*types)
# Do something and recurse.
end
我正在尝试使用以下代码在内联 C 中模仿这一点:
VALUE each_entity_c(int argc, VALUE *argv)
{
// ...
}
但这会产生编译错误:
inline.rb:486:in `ruby2c': Unknown type "VALUE *" (ArgumentError)
这是在 C 中完成此任务的正确方法吗?如果是这样,是什么导致了这个错误?如果不是,它是如何完成的?
最佳答案
而不是使用 builder.c
, 尝试 builder.c_raw
(或 builder.c_raw_singleton
)在定义您的方法时。您可能想将 VALUE self
添加到 args 列表的末尾,但在我的测试中它似乎可以使用或不使用。为了安全起见,也可能值得明确指定元数:
inline do |builder|
builder.c_raw <<-EOS, :arity => -1
VALUE each_entity_c(int argc, VALUE *argv, VALUE self)
{
// ...
}
EOS
end
使用 builder.c
,Ruby Inline 将重写该函数,使其接受 Ruby VALUE
类型作为参数,并添加代码以将这些转换为您的 c 类型原版的。您正在编写已经需要 VALUE
参数的代码,因此不希望完成此转换,因此您需要使用 c_raw
。
关于c - 在 Ruby/Inline C 中接受未定义数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073264/