3

我看到除了记录的非静态函数rb_yieldrb_yield_values其他一些缺乏有意义的注释(也不是静态的)之外,Ruby 还具有。这些是:

与有何rb_yield_values不同?rb_yield_values2

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

我在任何地方都找不到文档。

4

1 回答 1

1

好的,答案中有趣的部分 where is 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

yield 的参数数量可能会根据x( 或传递给 的参数的属性而有所不同special_method。如果我们知道我们正在处理多少个参数 ( count),我们将rb_yield_values(count, arg1, arg2, ..., argn)一如既往地使用。但如果我们不知道,它们就是存储在 Ruby 数组中,我们可以做rb_yield_splat(ary).thenary基本上可以是任意长度。

至于问题的最后一部分,what is rb_yield_values2,这很容易。让我们看一下定义:

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

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

并且rb_yield_values(int n, ...)是 C 版本,所以我们可以从 C 中调用一些待确定的参数(我假设在编译时;我从未使用过这个 C 约定,也不知道它被称为什么来搜索它) .

于 2013-08-08T22:57:05.130 回答