argument suggestion with shared argument validator

4 views (last 30 days)
Hello matlab community.
I am facing a problem with function argument validation and auto-completion. I have a set of static methods which share the same argument validation. In the following example, the input argument must belong to ["a", "b"].
I cannot find a way to have a common definition of this vector membership without losing auto completion:
classdef dummyClass
properties (Constant)
m = ["a", "b"];
end
methods (Static)
% this method works but membership vector is hardcoded
function s = fun1(a)
arguments
a {mustBeMember(a,["a", "b"])} = "a"
end
s = a;
end
% using a third party validator does not trigger auto completion
function s = fun2(a)
arguments
a {mustBeAorB(a)} = "a"
end
s = a;
end
% yield an error as dummyClass.m is not defined
function s = fun3(a)
arguments
a {mustBeMember(a,dummyClass.m)} = "a"
end
s = a;
end
function mustBeAorB(a)
arguments
a {mustBeMember(a,["a", "b"])} = "a"
end
end
end
end
There is apparently a solution using json file, but I would like to avoid it if possible.
Do you have any suggestion ?

Answers (2)

Sugandhi
Sugandhi on 9 Jun 2023
Hi,
I understand that you are facing a problem with function argument validation and auto-completion.
The possible work around could be, to define the valid membership vector as a class constant instead of a property constant. This way, you can reference the vector using the class name in instances where the auto-completion is lost.
Here's an updated version of your code that implements this approach:
classdef dummyClass
methods (Static)
% Define valid membership vector as a class constant
function m = validMembership()
m = ["a", "b"];
end
% Use validMembership class constant to validate input argument in the mustBeMember constraint
function s = fun3(a)
arguments
a {mustBeMember(a,dummyClass.validMembership())} = "a"
end
s = a;
end
end
end
In the code above, the valid membership vector is now defined as a class constant within a static function called 'validMembership'. 'The mustBeMember' constraint used in `fun3` references this class constant by calling `dummyClass.validMembership()`.
This approach provides a common definition for the valid membership vector without hard coding the values or relying on a third-party validator. It also retains auto-completion in the function when typing `dummyClass.`.
  1 Comment
guillaume deguyon
guillaume deguyon on 27 Jun 2023
Hi, thank you for your answer.
Using the membership function as you suggest, I get a similar error than if I use a constant property:
It won't accept anything that is not literal or previously defined arguments.
I tried it on both matlab 2022b and 2023a.
I also came to this json solution for code suggestion, but it adds maintenance workload and does not solve the problem of having a unique definition of the membership vector

Sign in to comment.


VBBV
VBBV on 7 Aug 2023
Edited: VBBV on 7 Aug 2023
function s = fun3(a)
          arguments
              a {mustBeMember(a,@dummyClass)} = "a"
          end
          s = a;
end

Did you try calling the dummyClass as above ?

  1 Comment
guillaume deguyon
guillaume deguyon on 8 Aug 2023
I tried. But I get the same error: it only accepts previously declared arguments or literals.
I also tried to define it via a non static method, so the class object is an argument of the function. But it refuses to access a property of the object:

Sign in to comment.

Categories

Find more on Argument Definitions in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!