addOptional的验证函数用于判断解析后的参数是否对应addOptional指定的参数。如果验证函数返回 false,则将当前解析的参数传递给下一个addOptional/addParameter
addOptional的默认验证函数是一个简单的~ischar,用于区分参数和值,由于性能原因。请参阅 TWM 员工here 的回答。但是,提供的解决方案并未涵盖所有用例。
以下是适用于任何数据类型以及参数/值结构的解决方案。唯一需要注意的是:您不能使用等于任何参数名称的值。
a = inputParser;
% Validation function needs to check
% - if argument is a parameter name or a value
% -> any(strcmp(x,a.Parameters))
% - if argument is a parameter/value struct
% -> isstruct(x) && any(ismember(fieldnames(x),a.Parameters))
addOptional(a,'o','x',@(x)~(any(strcmp(x,a.Parameters)) || isstruct(x) &&
any(ismember(fieldnames(x),a.Parameters))));
addParameter(a, 'p', 1);
%The next three parse commands give all the same result struct
% 'o' as positional parameter
parse(a, 'w', 'p', 2)
% 'o' as named parameter/value pair
parse(a, 'o', 'w', 'p', 2)
% parameters provided as param/value struct
pv.o='w';
pv.p=2;
parse(a, pv)
% value of 'o' is a struct
data.x = 1;
parse(a, data)
%You cannot use a value equal to a parameter name
parse(a, 'p', 'p', 2) % FAIL
如果你不介意速度损失,我建议你为可选参数编写一个自定义函数
function addOptionalExt(parserObj,key,default)
parserObj.addOptional(key,default,...
@(x)~(any(strcmp(x,parserObj.Parameters)) || ...
isstruct(x) && any(ismember(fieldnames(x),parserObj.Parameters))));
然后在你的例子中使用它
a = inputParser;
addOptionalExt(a, 'o', 'x');
addParameter(a, 'p', 1);
parse(a, 'w', 'p', 2)