我编写了一个测试函数,但遇到了麻烦inputParser
function doit(varargin)
p = inputParser;
p.KeepUnmatched = 1;
% why does this bomb if I put in @ischar ?
p.addOptional('shape','forgot',@(x) true);
p.addParameter('color', 'k', @(x) true); % 'cause color could be char or triplet
p.parse(varargin{:});
% more code using the parsed inputs
end
If I run
doit('hello','color','g')
or
doit('color','g')
使用上面的代码,一切都按预期工作。但是如果我更改输入验证optional
论证p.addOptional('shape', 'forgot',@(x) ischar)
,我收到错误p.parse(varargin{:})
No value was given for 'g'. Name-value pair arguments require a name followed by a value.
看起来我不明白最后一个参数是什么,即应该验证输入参数的匿名函数。解决办法是什么?
edit:
Win7 上的 Matlab 2015a 。
编辑2:变分测试用例
看来每个参数到底在哪个类中varargin
是影响行为。
function threeout = argthree( varargin)
p = inputParser;
p.KeepUnmatched = true;
%defshape = 'forgot';
defshape = 5;
addOptional(p,'shape',defshape,@isnumeric);
addParameter(p,'color', 'k',@ischar); %
parse(p, varargin{:});
threeout = p.Results;
end
至少有两件事可能导致 parse() 失败。第一:这个:
>> argthree('nono','color','vu')
Error using argthree (line 10)
No value was given for 'vu'. Name-value pair arguments require a name followed by a value.
请注意,尽管应该测试可选“shape”的数字,但解析器似乎认为“nono”是名称-值对的开头。
Entering either a numer or nothng works:
>> argthree('color','vu')
ans =
color: 'vu'
shape: 5
>> argthree(7,'color','vu')
ans =
color: 'vu'
shape: 7
现在替换 addOptional 行而不进行验证:addOptional(p,'shape',defshape );
对于所有三个调用,获得与上述相同的结果。
现在将默认值更改为defshape = 'forgot' % a charstring
>> argthree('nono','color','vu')
Error using argthree (line 10)
No value was given for 'vu'. Name-value pair arguments require a name followed by a value.
>> argthree('color','vu')
ans =
color: 'vu'
shape: 'forgot'
>> argthree(7,'color','vu')
ans =
color: 'vu'
shape: 7
现在尝试验证字符串输入:再次替换 addOptional 行 -addOptional(p,'shape',defshape,@ischar );
>> argthree('nono','color','vu')
ans =
color: 'vu'
shape: 'nono'
>> argthree('color','vu')
Error using argthree (line 10)
No value was given for 'vu'. Name-value pair arguments require a name followed by a value.
>> argthree(7,'color','vu')
Error using argthree (line 10)
The value of 'shape' is invalid. It must satisfy the function: ischar.
这里有一些非常不一致的地方parse()
尝试匹配varargin{:}
到参数列表(可选或名称-值对)。由于发生不一致的故障,据我所知,我无法设置带有可选字符参数后跟名称-值对的情况。
update
我已在 MathWorks 提交了一份错误报告“技术支持案例#02121531”,他们能够重现该问题。