Побочные эффекты вызова экземпляра класса MATLAB не сохраняются
Если я сделаю следующий класс игрушек в MATLAB:
classdef testIt
properties
a
b
c
end
methods
function obj = testIt
obj.a = 1;
obj.b = 2;
end
function obj = set.a(obj,a)
obj.a = a;
end
function obj = set.b(obj,b)
obj.b = b;
end
function obj = addup(obj)
obj.c = obj.a + obj.b;
end
end
end
а затем создать экземпляр и вызвать addup
метод:
>> aTest = testIt
Properties:
a: 1
b: 2
c: []
>> aTest.addup
Properties:
a: 1
b: 2
c: 3
>> aTest
Properties:
a: 1
b: 2
c: []
Недвижимость c
не был создан. Вместо этого мне нужно использовать синтаксис:
>> aTest = aTest.addup
>> aTest
Properties:
a: 1
b: 2
c: 3
Может кто-нибудь объяснить мне, почему это необходимо?
2 ответа
Matlab поддерживает два типа классов: классы обработки и классызначений.
Классы значений работают аналогично структурам и другим переменным Matlab в том смысле, что они передаются по значению. Таким образом, если вы хотите изменить экземпляр класса значения внутри функции, вам нужно вернуть и перезаписать экземпляр в вызывающей рабочей области.
Классы дескрипторов, с другой стороны, передаются по ссылке. Если вы изменяете значение свойства где-либо, класс обновляется во всех рабочих пространствах. Например, у вас может быть ссылка на объект в базовом рабочем пространстве, а другая - в графическом интерфейсе, а если вы измените один, другой изменит свое значение соответствующим образом.
Если вы измените свой код на classdef testIt < handle
объекты будут вести себя именно так, как вы ожидаете.
Также: Посмотрите на документацию