How do I use a class property validation function with a dynamic argument?

5 Ansichten (letzte 30 Tage)
In Matlab OOP, I wanna use a function like mustBeEqualSize(a,b) from the Examples on function property validation to validate a property:
classdef foo
properties
a
b {mustBeEqualSize(a,b)}
end
end
However, this gives me an error.

Akzeptierte Antwort

Jan Siegmund
Jan Siegmund am 14 Nov. 2020
The problem is, that MATLAB classes only support constant arguments on property validation.
However function arguments can be validated perfectly fine with dynamic arguments.
So a workaround is to validate the arguments of the constructor:
classdef Foo
properties
a
b
end
methods
function obj = Foo(a,b)
arguments
a
b {mustBeEqualSize(a,b)}
end
obj.a = a;
obj.b = b;
end
end
end
  4 Kommentare
Benjamin Penazek
Benjamin Penazek am 1 Okt. 2024
One thing that does half the job is overloading the ismember function for your class. Something like the following. I say half the job, because it "works" in the way you want, but it does not offer autocomplete (no popup with 'RMS Level', 'Gain', etc. will appear when you try to call obj.addPrimaryResult()).
methods
function boolOut = ismember(val, obj)
boolOut = ismember(val, obj.possibleResults);
end
end
Steven Lord
Steven Lord am 1 Okt. 2024
Try this:
classdef ContinuousSweep < handle
properties (Constant)
possibleResults = {'RMS Level','Gain','Phase','THD Ratio','THD Level','THD+N Ratio','THD+N Level','Impulse Response'}
end
methods
function obj = addPrimaryResult(obj,result)
%addPrimaryResult Adds a result of the specified type if it is allowed for this measurement type.
arguments (Input)
obj
result string {mustBePossibleResult(result)}
end
disp(result)
end %addPrimaryResult
end
end
function mustBePossibleResult(result)
PR = ContinuousSweep.possibleResults;
assert(ismember(result, PR), ...
result + " must be one of: " + newline + strjoin(PR, ", "))
end
You can reuse mustBePossibleResult in multiple methods, as a locally defined validation function. If the property is not Constant (and so you need to retrieve the value from the instance rather than from the class) you may need to include obj in the argument list of mustBePossibleResult but since that's a previous input argument that's okay. Then you could get obj.possibleResults inside mustBePossibleResult.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Software Development Tools finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by