How to use property validation functions in class definitions for struct fields?
23 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Davide
el 12 de Abr. de 2024
Comentada: Davide
el 12 de Abr. de 2024
Hi,
I have a class in which I define a struct S. How can I validate that its fields (c1, c2, ...) are numeric? mustBeNumeric or mustBeUnderlyingType(S,"double") throw an error because they checks if S itself is numeric/double.
classdef myClass
properties
a {mustBeText} = ''
b {mustBeNumeric} = 0
S { ? } = struct('c1',0,'c2',0,'c3',0)
end
end
Thanks.
0 comentarios
Respuesta aceptada
chicken vector
el 12 de Abr. de 2024
Editada: chicken vector
el 12 de Abr. de 2024
If this is helpful, please remember to vote for best answer.
classdef myClass
properties
a {mustBeText} = ''
b {mustBeNumeric} = 0
S {mustBeStructWith3NumericFields(S)} = struct('c1',0,'c2',0,'c3',0)
end
end
function mustBeStructWith3NumericFields(var)
if ~isstruct(var)
error("Input must be a struct.")
end
fn = fieldnames(var);
Nfn = length(fn);
if Nfn ~= 3
error("Input struct must have 3 fields.")
end
for j = 1 : Nfn
if ~isnumeric(var.(fn{j}))
error("Input struct fields must be numeric.")
end
end
end
You can run the following to test that your validator function performes its task correctly:
a = myClass;
S = struct('a',1,'b',2,'c',3);
a.S = S;
S = ["a" "b" "c"];
try
a.S = S;
catch ME
fprintf(ME.message + "\n");
end
S = struct('a',1,'b',2,'c',3,'d',4);
try
a.S = S;
catch ME
fprintf(ME.message + "\n");
end
S = struct('a',"1",'b',2,'c',3);
try
a.S = S;
catch ME
fprintf(ME.message + "\n");
end
2 comentarios
Stephen23
el 12 de Abr. de 2024
Editada: Stephen23
el 12 de Abr. de 2024
Note that IF-ERROR can often be simplified using ASSERT, e.g.:
function mustBeStructWith3NumericFields(var)
assert(isstruct(var), "Input must be a struct.")
fn = fieldnames(var);
Nfn = length(fn);
assert(Nfn==3, "Input struct must have 3 fields.")
etc.
Más respuestas (0)
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!