此测试函数返回输入的平方,并且在作为名称-值输入提供时可以添加可选的
offset
。
function out=test_parser(a,varargin)
% parse inputs
parser=inputParser;
parser.KeepUnmatched=true;
addRequired(parser,'a',@isnumeric);
addParameter(parser,'offset',0);
parse(parser,a,varargin{:});
offset=parser.Results.offset;
out=a^2+offset;
end
>> test_parser(2)
>> 4
>> test_parser(2,`offset`,1)
>> 5
现在假设我们不提供
offset
,而是提供不同的名称-值输入,其首字母与 offset
相同。由于parser.KeepUnmatched=true
,这应该被忽略。但它被捕获,就好像它是 offset
,并添加到输出中:
>> test_parser(2,'off',1)
>> 5
这对我来说是一个实际问题,因为在我的代码中,有时我有一个由另一个函数调用的函数,具有相同前导字符的不同输入,应该被忽略。
这似乎是一个严重的错误,因为 matlab 的 inputParser 会捕获任何具有相同前导字符的变量。还是我理解错了?
我意识到发生这种情况是因为 Matlab 的 inputParser 默认情况下进行部分匹配。为了防止这种情况,我们需要设置
PartialMatching=false
。