Разбор взаимоисключающих входных аргументов с помощью синтаксического анализатора ввода 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;
Другие вопросы по тегам