我正在使用 C 扩展方法来创建一个新的 ruby​​ 数组,但 RARRAY_LEN 没有设置。难道我做错了什么?

long int max = 4;
VALUE rAry;

rAry = rb_ary_new2(max);
printf("allocated: %lu\n", RARRAY_LEN(rAry));

输出:
allocated: 0

最佳答案

来自 array.c (Ruby 1.8.6):#define RARRAY_LEN(s) (RARRAY(s)->len)RARRAY(s)->lenArray#length 相同。
rb_ary_new2(4)Array.new(4) 不同。

VALUE
rb_ary_new2(len)
    long len;
{
    return ary_new(rb_cArray, len);
}

VALUE
rb_ary_new()
{
    return rb_ary_new2(ARY_DEFAULT_SIZE);
}
ARY_DEFAULT_SIZE 定义为 16

所做的只是为数组分配内存 - 但不填充它。当您知道数组的最终大小时使用它,因此不必动态重新调整大小。

您想要用于您的意图的是 rb_ary_new3rb_ary_new4

来自 Programming Ruby: The Pragmatic Programmer's Guide :



请注意,这些函数要求您为每个元素提供一个值。所以你需要做一些类似的事情: rAry = rb_ary_new3(4, Qnil, Qnil, Qnil, Qnil) 来复制 Array.new(4) 。如果您提供较少的参数,您会在 Ruby 中出现奇怪的行为。 (没有异常(exception)——尽管你得到了一个无效的对象。)

关于c - 为什么没有分配 RARRAY_LEN?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6511381/

10-15 04:54