如果我在变量编辑器中打开一维对象数组,我会得到一个不方便的视图,因为如果不单独单击每个对象,我就无法看到每个对象的属性值。
classdef myClass
properties
Property1 = 'abc'
Property2 = 123
Property3 = 'def'
end
methods
function s = struct(self)
pub_prop = properties(self);
s(numel(self)) = struct;
for iProp = 1:numel(pub_prop)
[s.(pub_prop{iProp})] = self.(pub_prop{iProp});
end
end
end
end
objArray(4) = myClass;
在变量编辑器中打开它,我看到:
我定义了一种将一维对象数组转换为一维结构数组的方法。然后使用结构体数组,我可以一次看到所有属性值,这就是我想要的。
structArray = objArray.struct
在变量编辑器中打开它,我看到:
如果我重载
openvar
函数,我可以通过转换为结构体数组然后传递它来实现我想要的openvar
。
classdef myClass2 < myClass
properties
end
methods
function openvar(varargin)
s = inputname(1);
openvar([s '.struct']);
disp('SUCCESS!')
end
end
end
objArray2(4) = myClass2;
objArray2.openvar
SUCCESS!
但是当我尝试在工作区中双击打开
objArray2
时,这不起作用。我收到错误:
Error using matlab.desktop.vareditor.VariableEditor.checkVariableName
The first argument to VariableEditor must be a valid variable name.
Error in openvar (line 96)
matlab.desktop.vareditor.VariableEditor.checkVariableName(name);
Error in myClass2/openvar (line 9)
openvar([s '.struct']);
调用问题的
myClass2.openvar
时出现错误消息是因为从工作区中双击如何调用 openvar
。我不确定 openvar
和 Workspace 之间交互的确切细节,但 inputname(1)
的计算结果为空。那么 openvar([s '.struct']);
正在尝试打开一个名为 .struct
的变量,这是一个无效名称。
查看
openvar.m
的函数参数,双击工作区调用时,varargin{1}
应该是变量名称char
。因此,可以根据 myClass2.openvar
的类型使用分支行为来修改 varargin{1}
。
classdef myClass2b < myClass
properties
end
methods
function openvar(varargin)
if isa(varargin{1},'myClass2b')
s = inputname(1);
openvar([s '.struct']);
elseif isa(varargin{1},'char') || isa(varargin{1},'string')
openvar([varargin{1} '.struct']);
else
error('Unexpected error');
end
end
end
end
objArray2(4) = myClass2b;
现在,从工作区双击可以将对象数组显示为一维结构数组。以下任何方法也都有效。
objArray2b.openvar
openvar(objArray2b)
openvar('objArray2b.struct')