2

我正在尝试理解 Matlab inputParser,从以前的问题看来,人们认为使用此类来验证函数的输入是最佳实践。因此,我在玩弄它,并编写了以下函数。

function output = inputParseTester(reqArg, varargin)
    parser = inputParser;
    addRequired(parser, 'reqArg')
    addOptional(parser, 'posArg', NaN)
    addParameter(parser, 'kwArg', NaN)

    parse(parser, reqArg, varargin{:})

    reqArg = parser.Results.reqArg;
    posArg = parser.Results.posArg;
    kwArg = parser.Results.kwArg;

    output = {reqArg, posArg, kwArg};
end

鉴于前面的函数,为什么当我输入一个数值时位置参数被接受,但是它作为一个或数组输入时为什么posArg 不被接受?此时我还没有定义任何验证函数,我可能想成为一个非数字变量,对吧?stringcharposArg

>> inputParseTester('arg1', 2, 'kwArg', 2)

ans =

  1×3 cell array

    {'arg1'}    {[2]}    {[2]}

>> inputParseTester('arg1', 'posArg', 'arg2', 'kwArg', 2)

ans =

  1×3 cell array

    {'arg1'}    {'arg2'}    {[2]}

>> inputParseTester('arg1', 'arg2', 'kwArg', 2)
Error using inputParseTester (line 7)
The argument 'arg2' is a string scalar or character vector and does not match any parameter names. It failed validation for the argument 'posArg'.

鉴于此结果,我认为这addOptional与 相同addParameter,只是添加了一些不需要的和未定义的验证。这可能不是这种情况,那么发生了什么?

4

1 回答 1

1

虽然绝不是直观的,但您会观察到记录的行为:

对于可选字符串参数,请指定验证函数。如果没有验证函数,输入解析器会将字符串参数解释为无效的参数名称并引发错误。

https://mathworks.com/help/matlab/ref/inputparser.addoptional.html

于 2019-11-02T07:53:03.750 回答