【问题标题】:Dynamic field reference for nested structures [duplicate]嵌套结构的动态字段引用[重复]
【发布时间】:2019-01-14 13:39:24
【问题描述】:

在我们的 MATLAB 代码中,我们经常使用 dynamic field references,它们非常棒。我们有许多具有不同字段集的不同数据结构,因此只需使用struct.('field') 表示法就可以更轻松地访问其中任何一个,而无需使用eval 语句。

但是,我们遇到的问题是,其中许多结构都有多个层次,而且我们并不总是知道需要深入到结构中。理想情况下,我们希望能够在不使用 eval 语句的情况下访问它们,可能类似于

struct.('field.field2.field3')

有没有办法使用内置功能动态访问深度未知的结构?还是我们必须创建一个自定义函数来访问我们所有的结构?

【问题讨论】:

  • 但是struct.('field.field2.field3') 你知道深度吗?还是struct.('unknown_amount_of_variables.desired_field')
  • 或者您在寻找struct.('field').('field2').('field3') 吗?
  • @AnderBiguri 它最接近struct.('unknown_amount_of_variables.desired_field')
  • "[Dynamic field names] are pretty wonderful" - 这是非常主观的,从性能、代码可读性、维护或健壮性的角度来看,通常不是这样......
  • @AnderBiguri 我收到了一个字符串,它可能是field1.desiredFieldfield1.field2.desiredFieldfield1.<more levels>.desiredField。我会确切地知道该领域的位置。我试图弄清楚是否有一个内置函数可以让我动态访问该字段而无需使用 eval 或必须自己解析和循环所有内容。

标签: matlab dynamic struct


【解决方案1】:

此代码适用于以下假设和用例:

  1. 在某个嵌套的动态结构中,您不知道某个字段的位置。
  2. 此字段的名称是唯一的,即结构中的任何地方都没有其他同名的字段。

以下功能起作用:

function [fieldplace]=findfield(s,field)

% is one of these?
fieldplace={};
if (isfield(s,field))
    fieldplace{end+1}=field;
    return;
end

if ~isstruct(s)
    fieldplace={};
    return;
end

% otherwise is nested somewhere, use recursivity.
fnames=fieldnames(s);
for ii=1:numel(fnames)
    fieldplace=findfield(s.(fnames{ii}),field);
    if ~isempty(fieldplace)
        fieldplace=[fnames{ii} fieldplace];
        return;
    end
end


end

用例:

s.a=1;
s.b.c=2;
s.b.d=3;
s.e.f.g=4;
s.h.i.j.k=5;
result=findfield(s,'k');

您可以将字段解读为:

getfield(s,result{:})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2020-08-23
    • 2021-08-08
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多