我想使用动态字段名而不是 setfield 实现以下目标:
假设一个结构“myStruct”有一组嵌套结构,即
myStruct.a.b.c = 0
myStruct.a.d = 0
myStruct.a.e.f.g = 0
我希望能够灵活设置叶子结构值如下:
fields = {'a', 'b', 'c'}
paramVal = 1
setfield(myStruct, fields{:}, paramVal)
这可以使用 setfield。有没有一种语法可以使用动态字段名来做到这一点?以下显然不起作用,因为字段名需要是字符串而不是数组,但演示了我想要的内容:
myStruct.(fields{:}) = 0
相当于:
myStruct.('a').('b').('c') = 0
最佳答案
没有 eval
的递归解决方案,从我的一个旧实用函数中提取:
function s = setsubfield(s, fields, val)
if ischar(fields)
fields = regexp(fields, '\.', 'split'); % split into cell array of sub-fields
end
if length(fields) == 1
s.(fields{1}) = val;
else
try
subfield = s.(fields{1}); % see if subfield already exists
catch
subfield = struct(); % if not, create it
end
s.(fields{1}) = setsubfield(subfield, fields(2:end), val);
end
我猜 try/catch
可以用 if isfield(s, fields{1}) ...
代替,我不记得我为什么编码了就像那样。
用法:
>> s = struct();
>> s = setsubfield(s, {'a','b','c'}, 55);
>> s = setsubfield(s, 'a.b.d.e', 12)
>> s.a.b.c
ans =
55
>> s.a.b.d.e
ans =
12
关于matlab - 使用动态字段名的嵌套结构访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145042/