argument suggestion with shared argument validator

4 次查看(过去 30 天)
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 ?

回答(2 个)

Sugandhi
Sugandhi 2023-6-9
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 个评论
guillaume deguyon
guillaume deguyon 2023-6-27
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

请先登录,再进行评论。


VBBV
VBBV 2023-8-7
编辑:VBBV 2023-8-7
function s = fun3(a)
          arguments
              a {mustBeMember(a,@dummyClass)} = "a"
          end
          s = a;
end

Did you try calling the dummyClass as above ?

  1 个评论
guillaume deguyon
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:

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Argument Definitions 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by