В вашем случае экземпляр ctx
содержит ссылку на объект массива в переменной экземпляра @class_array
.В методе func
новая ссылка на этот же объект создается и присваивается локальной переменной local_array
.
Когда вы присваиваете [4,3,5,5,6]
для local_array
, вы не перезаписываете объект, на который ссылаетсяна ctx
вы перезаписываете ссылку, хранящуюся в local_array
, делая ее ссылкой на новый массив.
С точки зрения указателей то, что вы делаете, аналогично этому:
int array[] = { 1, 2, 3, 4, 5 };
int new_array[] = { 4, 3, 5, 5, 6 };
int * ctx_array = array;
int * local_array = ctx_array;
local_array = new_array; // ctx_array still points to array[0]
Я думаю, что вы хотите достичь, это:
int ** local_array = &ctx_array;
*local_array = new_array; // ctx_array now points to the new array
Этот тип косвенного обращения невозможен в Ruby.Вы можете изменить объект, только вызвав методы для него.
Однако перевод вашего C-фрагмента в Ruby дает полностью функциональный код:
def func(ctx)
local_array = ctx.class_array
local_array[0] = 4
end
ctx.class_array[0]
=> 4
Это работает, потому что local_array
ссылается на то же самоеобъект как ctx.class_array
.