Разбор взаимоисключающих входных аргументов с помощью синтаксического анализатора ввода MATLAB
У меня есть функция, которая имеет как минимум два обязательных входных аргумента. В зависимости от значения второго аргумента, может быть третий обязательный входной аргумент. Мне интересно, каков наилучший способ кодирования надежной функции, которая включает эти требования, с использованием синтаксического анализатора ввода MATLAB?
Функция может выглядеть так:
function vout = test(ReqInpArg1, ReqInpArg2, varargin)
ReqInpArg2
может содержать следующее содержимое строки:
'cash'
'absHurdleRate'
'none'
Если пользователь выбирает cash
чем другой входной аргумент numCashTicker
должен быть определен как часть varargin
например, 'numCashTicker', 4
, Если absHurdleRate
был выбран другой входной параметр, например, 'hurdleRate', 0.2
, Если, с другой стороны, none
был выбран, ни один из этих входных параметров не должен быть определен. По сути дела, numCashTicker
а также hurdleRate
являются взаимоисключающими, то есть они не должны быть определены одновременно. Кроме того, если пользователь не выбрал none
Он должен определить один из других входных аргументов varargin.
Какова наилучшая практика / лучшая стратегия для реализации этих требований?
1 ответ
Я придумал следующее решение:
function vout = test(timeSeries, hurdleRate, varargin)
p = inputParser;
expectedTypes = {'none', 'cash' 'absHurdleRate'};
default_numCashTicker = [];
default_absHurdleRate = [];
p.addRequired('timeSeries');
p.addRequired('hurdleRate',@(x) any(validatestring(x,expectedTypes)));
p.addParameter('numCashTicker', default_numCashTicker);
p.addParameter('absHurdleRate', default_absHurdleRate);
parse(p, timeSeries, hurdleRate, varargin{:});
numCashTicker = p.Results.numCashTicker;
switch hurdleRate
case 'none'
if ~isequal(numCashTicker, default_numCashTicker)
throw(MException('test:ParsingError', ...
'"none" does not require the "numCashTicker" parameter values"'));
elseif ~isequal(absHurdleRate, default_absHurdleRate)
throw(MException('test:ParsingError', ...
'"none" does not require the "absHurdleRate parameter values"'));
end
case 'cash'
if ~isnumeric(numCashTicker)
throw(MException('test:ParsingError', ...
'"cash" requires a numeric "numCashTicker" parameter value'));
elseif ~isequal(absHurdleRate, default_absHurdleRate)
throw(MException('CSmomRoC:ParsingError', ...
'"cash" does not require the "absHurdleRate parameter values"'));
end
case 'absHurdleRate'
if ~isnumeric(absHurdleRate)
throw(MException('CSmomRoC:ParsingError', ...
'"absHurdleRate" requires a numeric "absHurdleRate" parameter value'));
elseif ~isequal(numCashTicker, default_numCashTicker)
throw(MException('CSmomRoC:ParsingError', ...
'"absHurdleRate" does not require the "numCashTicker" parameter value.'));
end
end
...
...
...
end;