Я почти уверен, что вам нужно использовать макрос RARRAY_PTR
для pairs
, чтобы получить базовый массив;например, внутренняя реализация Array # push (для 1.9.2) выглядит следующим образом:
static VALUE
rb_ary_push_1(VALUE ary, VALUE item)
{
long idx = RARRAY_LEN(ary);
if (idx >= ARY_CAPA(ary)) {
ary_double_capa(ary, idx);
}
RARRAY_PTR(ary)[idx] = item;
ARY_SET_LEN(ary, idx + 1);
return ary;
}
if
просто сортирует любое необходимое изменение размера, тогда есть RARRAY_PTR(ary)[idx]
для доступа к одному слотув массиве.
У меня нет официальных ссылок, подтверждающих это, но, надеюсь, это будет полезно.