下面是一个在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
答案 0 :(得分:2)
来自帮助
“属性就像结构对象的字段。”
因此,您可以使用属性来读/写它。但不要像你想要的那样使用它作为变量。当你写
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.
因此,我认为你想要做的事情是可能的。
答案 1 :(得分:2)
前言:您不应期望Matlab的oop功能太多。即使matlab>事情变得更好了2008a,与真正的编程语言相比,Matlab中的oop支持非常差。 根据我的经验,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支持输入参数/变量,那么你的代码就可以了。但是,由于您可以在初始化后为参数/变量分配完全不同的数据类型,因此编译器不允许您执行您想要执行的操作,因为您可能会遇到麻烦。
答案 2 :(得分:0)
错误是
??? 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提高它。