我正在使用C扩展方法创建一个新的ruby数组,但RARRAY_LEN没有设置。我做错了吗?
long int max = 4;
VALUE rAry;
rAry = rb_ary_new2(max);
printf("allocated: %lu\n", RARRAY_LEN(rAry));
输出:
allocated: 0
答案 0 :(得分:2)
来自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:
VALUE rb_ary_new3(long length, ...")
返回给定长度的新Array
,并填充剩余的参数。
VALUE rb_ary_new4(long length, VALUE *values")
返回给定长度的新Array
并填充C数组值。
请注意,这些函数要求您为每个元素提供值。因此,您需要执行以下操作:rAry = rb_ary_new3(4, Qnil, Qnil, Qnil, Qnil)
来复制Array.new(4)
。如果你提供较少的参数,你会在Ruby中遇到奇怪的行为。 (没有例外 - 尽管你得到了一个无效的对象。)
答案 1 :(得分:0)
显然需要使用rb_ary_store(obj,index,val)来增加RARRAY_LEN。奇怪的是,一个如此重要的方法基本上没有记录。