2013-07-26 20 views
3

我发现Ruby除了有记录的非静态函数rb_yieldrb_yield_values之外,还有一些缺乏有意义的评论(也不是静态的)。它们是:C Ruby(MRI)中的rb_yield_splat和rb_yield_values2是做什么的?

如何rb_yield_valuesrb_yield_values2有什么不同?

rb_yield_splat看起来像是需要Array作为参数。当我使用它时,它似乎像在Ruby中的*运算符一样处理数组,例如yield(*params)。它是否正确?

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

回答

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 

的参数产量的数量可以根据变化如果我们知道我们要处理多少个参数(count),我们一直使用rb_yield_values(count, arg1, arg2, ..., argn)但是如果我们不这样做,并且它们存储在一个Ruby数组中,我们可以只是做rb_yield_splat(ary)。那么ary基本上可以是任意长度。

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

VALUE rb_yield_values2(int argc, const VALUE *argv) { 
    return rb_yield_0(argc, argv); 
} 

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

And rb_yield_values(int n, ...)是C版本,所以我们可以从C调用一些参数来确定(我在编译时假设;我从来没有使用过这个C约定,也不知道它叫做什么去搜索它)。