我正在使用 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)->len
与 Array#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_new3
或 rb_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/