validate arguments stop implicit expansion

6 visualizaciones (últimos 30 días)
Nilay Modi
Nilay Modi el 13 de Jul. de 2024
Comentada: Nilay Modi el 14 de Jul. de 2024
classdef Car
properties
id
position
end
methods
function obj = Car(id, position)
arguments
id (1,1) {mustBeNumeric, mustBePositive, mustBeInteger, mustBeNonempty}
position (1,3) double {mustBeVector, mustBeNonempty}
end
obj.id = id;
obj.position = position;
end
end
end
myCar = Car(42, 20)
Instantiation of myCar creates position vector [20, 20, 20]. This is because of implicity expansion. I am trying to stop this by adding a custom validator, but having trouble.

Respuestas (1)

Bhanu Prakash
Bhanu Prakash el 13 de Jul. de 2024
Hi Nilay,
If I understand it correctly, you want to ensure that the 'position' argument passed is a vector and thereby avoid implicit expansion.
For this use case, you can simply use a custom function (validatePositionArgument, in this case) to verify that the argument 'position' is a vector. If it's not, then the code throws an error. Here is the modified code:
classdef Car
properties
id
position
end
methods
function obj = Car(id, position)
validateattributes(id, {'numeric'}, {'scalar', 'positive', 'integer', 'nonempty'}); % validate 'id'
validatePositionArgument(position); % custom function to validate position
obj.id = id;
obj.position = position;
end
end
end
function validatePositionArgument(position)
% Throws an error if the input 'position' is not a vector or if it's
% length is not equal to 3.
if ~isvector(position) || length(position) ~= 3
error('Position must be a 1x3 vector.');
end
end
Instantiation of myCar with the 'position' argument as a vector:
>> myCar = Car(42, [10, 15, 20])
myCar =
Car with properties:
id: 42
position: [10 15 20]
If the 'position' argument is not a vector or if its size is not equal to 3:
>> myCar = Car(42, 20)
Error using Car>validatePositionArgument (line 21)
Position must be a 1x3 vector.
Error in Car (line 9)
validatePositionArgument(position); % custom function to validate position
For more information on the 'validateattributes' function, you can refer to the following documentation:
I hope this helps!
  1 comentario
Nilay Modi
Nilay Modi el 14 de Jul. de 2024
How can I do this inside the arguments block?
arguments
id (1,1) {mustBeNumeric, mustBePositive, mustBeInteger, mustBeNonempty}
position (1,3) double {mustBeVector, mustBeNonempty, validatePositionArgument(position)}
end
function validatePositionArgument(position)
% Throws an error if the input 'position' is not a vector or if it's
% length is not equal to 3.
if ~isvector(position) || length(position) ~= 3
error('Position must be a 1x3 vector.');
end
end
Here, inside the validatePositionArgument function, the position argument is already converted to [20, 20, 20]. Your solution doesn't use the argments block. Is it not possible to do this with using arguments block? Thanks.

Iniciar sesión para comentar.

Categorías

Más información sobre Argument Definitions en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by