在变量编辑器中像查看一维结构数组一样查看一维对象数组

问题描述 投票:0回答:1

如果我在变量编辑器中打开一维对象数组,我会得到一个不方便的视图,因为如果不单独单击每个对象,我就无法看到每个对象的属性值。

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']);
matlab oop struct
1个回答
0
投票

调用问题的

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')
© www.soinside.com 2019 - 2024. All rights reserved.