С array.c
(Руби 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
.
С Программирование Ruby: Прагматическое руководство для программиста :
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. (Без исключений - несмотря на то, что вы получаете недопустимый объект.)