Почему нельзя использовать свойство объекта в качестве индекса в цикле for?(MATLAB) - PullRequest
0 голосов
/ 22 сентября 2011

Ниже приведен пример, который не работает в Matlab, потому что obj.yo используется в качестве индекса цикла for. Вы можете просто преобразовать это в эквивалентный цикл while, и он отлично работает, так почему же Matlab не разрешит запускать этот код?

classdef iter_test
    properties
        yo = 1;
    end
    methods
        function obj = iter_test
        end
        function run(obj)
            for obj.yo = 1:10
                disp('yo');
            end
        end
    end
end

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

из справки

"свойства похожи на поля объекта структуры."

Следовательно, вы можете использовать свойство для чтения / записи в него. Но не используйте его как переменную, как вы пытаетесь сделать. Когда ты пишешь

   for obj.yo = 1:10
                disp('yo');
    end

затем obj.yo используется как переменная , а не имя поля .

сравните с фактическим использованием структуры, чтобы сделать его более понятным:

EDU>> s = struct('id',10)
for s.id=1:10
    disp('hi')
end

s = 

    id: 10

??? for s.id=1:10
         |
Error: Unexpected MATLAB operator.

Однако можно «установить» для поля структуры новое значение

EDU>> s.id=4
s = 
    id: 4

сравните вышеуказанную ошибку с тем, что вы получили:

??? Error using ==> iter_test
Error: File: iter_test.m Line: 9 Column: 20
Unexpected MATLAB operator.

Поэтому я не считаю возможным то, что вы пытаетесь сделать.

2 голосов
/ 23 сентября 2011

Предисловие: Не стоит ожидать слишком многого от возможностей Matlab oop. Несмотря на то, что с matlab> 2008a дела пошли лучше, по сравнению с реальным языком программирования, поддержка Matlab очень плохая. Исходя из моего опыта, Mathworks пытается максимально защитить пользователя от ошибок. Иногда это также означает, что они ограничивают возможности. Глядя на ваш пример, я считаю, что происходит то же самое.

Возможный ответ: Поскольку Matlab не имеет явной типизации (переменные / параметры набираются на лету), ваш код может столкнуться с проблемами. Представьте себе:

$ a = iter_test()
% a.yo is set to 1

% let's overwrite 'yo'
$ a.yo = struct('somefield', [], 'second_field', []);
% a.yo is now a struct

Поэтому следующий код не будет работать:

$ for a.yo
     disp('hey');
  end

Могу поспорить, что если бы matlab поддерживал типизацию параметров / переменных, ваш код работал бы просто отлично. Однако, поскольку вы можете назначить совершенно другой тип данных параметру / переменной после инициализации, компилятор не позволяет вам делать то, что вы хотите, потому что у вас могут возникнуть проблемы.

0 голосов
/ 22 сентября 2011

Ошибка

??? Error: File: iter_test.m Line: 9 Column: 20
Unexpected MATLAB operator.

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

РЕДАКТИРОВАТЬ : Это также происходит для всех других видов подписки:

Следующие все не удалось разобрать:

a = [0 1];
for a(1) = 1:10, end

a = {0 1};
for a{1} = 1:10, end

a = struct('a', 0, 'b', 0);
for a.a = 1:10, end

Это проблема парсера MATLAB. Поднимите это с Mathworks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...