我发现Ruby除了记录的非静态函数rb_yield
和rb_yield_values
之外还有其他几个缺少有意义的注释(并且也不是静态的)。这些是:
rb_yield_values2
:http://rxr.whitequark.org/mri/source/vm_eval.c#974 rb_yield_splat
:http://rxr.whitequark.org/mri/source/vm_eval.c#980 rb_yield_values
与rb_yield_values2
的区别如何?
而rb_yield_splat
似乎需要Array
作为参数。当我使用它时,它似乎将数组视为Ruby中的*
运算符,例如yield(*params)
。这是对的吗?
我无法在任何地方找到文档。
答案 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;不知道它叫什么来搜索它。)