- Create two classes, namely “inner” and “outer” where “outer” has the property that holds an object of the “inner” class.
Check if a nested field exists in a structure OR nested property in an object
18 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
I'm working with nested structures with different fields that may hold objects with properties, and any mix of such datatypes. I noticed there are several questions about finding whether nested fields in a struct exist, but couldn't find an answer for finding whether nested properties of objects exist. For example, I have an object with a property, that holds another object with another property, itself being a struct with fields:
obj2.prop2 = struct('field','value');
obj1.prop1 = obj2;
Does "obj1.prop1.prop2.field" exist?
I wrote something that may be useful:
function tf = ischild(o, varargin)
if isempty(varargin), tf = true; return; end
if (numel(varargin)==1) && contains(varargin{1},'.')
varargin = strsplit(varargin{1},'.');
end
child = varargin{1};
if (isobject(o) && isprop(o,child)) || (isstruct(o) && isfield(o,child))
tf = ischild(o.(child),varargin{2:end});
else
tf = false;
end
end
You can use it in two different ways:
ischild(obj1,'prop1.prop2.field')
ischild(obj1,'prop1','prop2','field')
The surprising thing, I noticed, is that MATLAB's "getfield()" works well for nested structs but not for objects, while "setfield()" works for nested objects/struct mix. So at least before calling "getfield" or "setfield", you could check if it exists with "ischild()". Hope this helps.
0 comentarios
Respuestas (1)
Shivam
el 21 de Sept. de 2023
I understand that you want to know how to access fields within a nested structure. It appears that you have implemented the "ischild" function to validate the existence of a field within an object.
You can follow the below workaround to resolve the issue.
classdef outer
properties
innerObj
end
methods
function obj = outer(field, value)
obj.innerObj = inner(field, value);
end
function innerObjPropFromOuterObj(obj)
disp(['obj.innerObj.innerProp.field', obj.innerObj.innerProp.field]) % target value
end
end
end
classdef inner
properties
innerProp
end
methods
function obj = inner(field, value)
obj.innerProp = struct(field, value);
end
end
end
2. create an object of "outer" class.
obj = outer("field","value");
Additionally, your implementation and workflow involving the “ischild”, “getfield” and “setfield” functions also appear to be correct.
I hope this helps.
0 comentarios
Ver también
Categorías
Más información sobre Structures en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!