C Ruby(MRI)中的rb_yield_splat和rb_yield_values2有什么作用?

时间:2013-07-26 17:48:02

标签: c ruby

我发现Ruby除了记录的非静态函数rb_yieldrb_yield_values之外还有其他几个缺少有意义的注释(并且也不是静态的)。这些是:

rb_yield_valuesrb_yield_values2的区别如何?

rb_yield_splat似乎需要Array作为参数。当我使用它时,它似乎将数组视为Ruby中的*运算符,例如yield(*params)。这是对的吗?

我无法在任何地方找到文档。

1 个答案:

答案 0 :(得分:1)

好的,答案的有趣部分是rb_yield_splat,它允许我们将数组视为参数,就像我们*params时一样。

例如,我们假设我们有某种特殊方法可以这样工作:

x.special_method do |x,y,z|
  # do whatever with x, y, and z
end

或者像这样:

x.special_method do |x,y|
  # do whatever, but this time only with x and y
end

收益的参数数量可能会有所不同,具体取决于x的属性(或传递给special_method的参数。如果我们知道我们要处理多少个参数({{1 }),我们一如既往地使用count。但如果我们不这样做,并且它们存储在Ruby数组中,我们就可以rb_yield_values(count, arg1, arg2, ..., argn)。然后{{1}基本上可以是任何长度。

至于问题的最后部分,rb_yield_splat(ary)是什么,这很容易。让我们来看看定义:

ary

这基本上只是Ruby的rb_yield_values2方法,它接受任意数量的参数。

VALUE rb_yield_values2(int argc, const VALUE *argv) { return rb_yield_0(argc, argv); } 是C版本,所以我们可以从C中调用一些参数来确定(我假设在编译时;我从未使用过这个C约定,并且没有#&# 39;不知道它叫什么来搜索它。)