Почему MATLAB выдает ошибку неопределенной переменной, когда я пытаюсь присвоить свойство класса другому свойству класса в блоке свойств?

Если я запускаю этот код для создания простого класса:

classdef myclass
    properties
        m = 2;
        n = m + 2;
    end
end

Я получаю сообщение об ошибке:

Undefined function or variable 'm'.
Error in myclass (line 1)
classdef myclass 

Почему это? Я пропустил конструктор в этом минимальном примере, потому что а) ошибка все еще возникает, если я добавляю конструктор, и б) я столкнулся с этой ошибкой в ​​классе модульного тестирования, а конструктор не вызывается в таких классах в MATLAB 2013b.


person Michael A    schedule 22.11.2013    source источник


Ответы (3)


На этой странице есть примечание, которое может объясните проблему:

Примечание: Оценка значений свойства по умолчанию происходит только тогда, когда значение сначала необходимо, и только один раз, когда MATLAB сначала инициализирует класс. MATLAB не переоценивает выражение каждый раз, когда вы создаете экземпляр класса.

Я понимаю, что это означает, что когда вы создаете экземпляр класса, m еще не инициализирован, поэтому вы не можете использовать его для установки значения по умолчанию для другого свойства n.

Единственный способ заставить его работать — объявить m как константное свойство:

classdef myclass
    properties (Constant = true)
       m=2; 
    end
    properties
        n = myclass.m + 2;
    end
end

Но это, вероятно, не поможет, если вы хотите изменить m.

person chappjc    schedule 22.11.2013
comment
На самом деле это работает очень хорошо, потому что мне не нужно менять m в моей среде модульного тестирования. Благодарю вас! - person Michael A; 23.11.2013

Вы также можете перенести инициализацию в конструктор:

classdef myclass
    properties
        m = 2;
        n;
    end
    methods
        function obj = myclass(obj)
            obj.n = obj.m + 2;
        end
    end
end
person MattyG    schedule 02.09.2015
comment
Я думаю, что это может быть лучшим решением, поскольку оно позволяет вам изменить m в будущем. - person somerandomdude; 23.03.2016

MATLAB определяет свойства как classname.propertyname. Следовательно, если вы измените код на следующий, он должен работать.

classdef myclass
    properties
        m = 2;
        n = myclass.m + 2;
    end
end

С уважением,

person Rhinoceros256    schedule 22.11.2013
comment
Вы проверяли это? Это не работает. См. другое решение; вам нужно свойство Constant. - person Michael A; 23.11.2013
comment
Ну да, я сделал это, скопировав его в MATLAB R2013a. - person Rhinoceros256; 27.11.2013
comment
Я добавил, что использую версию 2013b, так как этот код не работает в этой версии. - person Michael A; 02.12.2013