У меня есть класс, который инкапсулирует доступ к массиву в wierd способом; Конструктор класса принимает функцию ручку, которая является своим родом преобразования индексов перед передачей их в массивИмитировать 'this' указатель в matlab
classdef MyClass
properties
arr
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
obj.accessHandle = @(i) obj.arr(trans(i))
end
end
Проблема анонимных функции копируют массив в его собственное рабочее пространство, и если мы изменяем массив, его не изменяется в функции. По существу то, что нужно, чтобы перейти к анонимной функции на «это» указатель/ссылку, как в Java/C++/и т.д.
Простое решение заключается в создании дескриптора массива и передать его функции:
classdef MyClass
properties
arr
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
tmp = PropertyReference(obj, 'arr'); %See http://stackoverflow.com/questions/7085588/matlab-create-reference-handle-to-variable
%for the definition
obj.accessHandle = @(i) tmp(trans(i));
end
end
end
проблема теперь, когда я передать экземпляр класса к функции, ссылка передается по-прежнему относится к объекту за пределами функции:
function foo(ins)
ins.arr = [1 2];
disp(ins.accessHandle(1));
end
cl = MyClass([0 3], @(x) x);
foo(cl) //output 0 instead of 1
disp(ins.accessHandle(1)) //output 0
РЕДАКТИРОВАТЬ: Класс должен быть классом значений, семантика заключается в том, что при создании копии класса поле accessHandle
изменяет обработчик массива, который он использует.
Как я могу достичь правильной семантики?
Будет ли подклассификация 'handle' исправлена? – TroyHaskin
@TroyHaskin @Suever Я не могу сделать это ручкой, как я объяснил в последнем отчёте; 'foo' не изменяет ввод, только его копия –
Эквивалентное определение C++ для accessHandle будет' [this] (int x) {return this-> arr (trans (x));} ', если это помогает –