我想创建一个存储包含所需值的属性的文件。 每个属性都必须定义为struct数组。 我当前的struct初始化数组方式:
classdef myClass < handle
properties(Constant)
myProp1 = struct(...
'Name', {'A','B'},...
'Value', {'1','2'});
end
end
我希望如何编写我的struct数组(我觉得它更干净和可读):
classdef myClass < handle
properties(Constant)
myProp1(1).Name = 'A';
myProp1(1).Value = 1;
myProp1(2).Name = 'B';
myProp1(2).Value = 2;
end
end
我应该如何实现这一目标?
由于
答案 0 :(得分:1)
我认为不可能像你提议的那样在属性定义中创建结构。 (见我对你的问题的评论)。另一种方法是在构造函数中创建结构数组。使用(SetAccess=private)
,以便不会从外部更改属性。
% myClass.m
classdef myClass < handle
properties(SetAccess=private)
myProp1 = struct
end
methods
function obj = myClass() % constructor
obj.myProp1(1).Name = 'A';
obj.myProp1(1).Value = 1;
obj.myProp1(2).Name = 'B';
obj.myProp1(2).Value = 2;
end
end
end
答案 1 :(得分:0)
您可以使用object composition解决此问题。
似乎myProp
中的属性myClass
代表了其他内容。为简单起见,我将假设它是一个人(您需要调整示例以满足您的需求)。您可以使用属性Person
,Name
,Value
创建一个ParentName
类,并在您的课程中使用它。 myClass
中的属性部分如下所示:
myProp(1) = Person(name1, value1, parent_name1);
myProp(2) = Person(name2, value2, parent_name2);
...
myProp(N) = Person(nameN, valueN, parent_nameN);
或者,您可以准备Person
类以接受数组作为输入:
names = {name1, name2, ..., nameN};
values = [value1, value2, ..., valueN];
parent_names = {pname1, pname2, ..., pnameN};
... %//possibly more code here
myProp = Person(names, values, parent_names);
并且班级Person
将始终保持正确的顺序,提供制定者和吸气剂等。
第一个解决方案的Person
类的存根看起来像这样(接受数组的类会更长):
classdef Person < handle
properties (Access = private)
name = '';
value = 0;
parent_name = '';
end
methods (Access = public)
function this = Person(name, value, parent_name)
this.SetName(name);
this.SetValue(value);
this.SetParentName(parent_name);
end
function SetName(this, name)
this.name = name;
end
function SetValue(this, value)
this.value = value;
end
function SetParentName(this, parent_name)
this.parent_name = parent_name;
end
end
end
答案 2 :(得分:0)
您设置myProp
的原始方式没有任何问题。
但是,如果你只关心可读性,可以添加一个名为makeMyProp
的私有静态方法,它可以按照你想要的方式布局,它返回一个填充的结构{{ 1}}。
然后,在myProp
部分中,说properties
。
答案 3 :(得分:0)
classdef myClass < handle
properties(Constant)
myProp1a = struct('Name','A','Value',1);
myProp1b = struct('Name','B','Value',2);
myProp1 = [myClass.myProp1a, myClass.myProp1b];
end
end
答案 4 :(得分:-1)
你可以使用enumeration
(是的,这显然存在于MATLAB中)。
示例用法是:
classdef ExampleEnum < uint8 %// Can also be another datatype
enumeration
%// name value
A (1)
B (2)
end
end
然后MATLAB会根据您使用枚举对象的方式自动使用字符串或值(文档中提到了这一点)。