Побочные эффекты вызова экземпляра класса 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объекты будут вести себя именно так, как вы ожидаете.

Также: Посмотрите на документацию

Добавить к определению класса:

classdef testIt < handle
Другие вопросы по тегам