1. 对于可选位置参数 (addOptional) 和可选参数 (addParameter) 共同存在的情形, 仍不能正确的解析, 示例在原来的例子中加入 addRequired 如下:
function findArea(varargin)
p = inputParser;
p = addRequired(p, 'width', @(x) isnummeric(x) && isscalar(x) && (x > 0));
p = addOptional(p, 'height', 1);
p = addParameter(p, 'units', 'm');
p = addParameter(p, 'shape', 'square');
p = parse(p, varargin{:});
width = p.Results.width
height = p.Results.height
units = p.Results.units
shape = p.Results.shape
endfindArea(2, 3, "units", "cm") 现在可以正确解析了. 但是如果可选位置参数输入不足时, 如 findArea(2, "units", "cm") 就不能正常解析了.
在 inputParser 类的代码第 152 行定义的当前参数位置指针 pos = 1, 有一个必须参数和一个可选位置参数, pos 经过两次加一得到 pos = 3, 此时解析参数的时候, 剩余可选参数为 varargin(3:end) = "cm", "units" 虽然没有像之前的版本被赋值给 "height", 但也被吞掉消失. 只剩下 "units" 不是成对出现导致解析可选参数出错.
2. 在添加参数的时候, checkArgs(list, value, validator) 函数是通过 ismember 函数来判断是否存在该参数名的.
ismember 只能判断字符元胞数组, 那么在添加参数的时候只能使用字符数组, 如上面的示例 p = addOptional(p, 'width', 1); 原本使用的字符串在使用的时候就全部报错.
这个问题只需要在 inputParser 中添加几个 char 全部转化成字符数组即可, 而不用关心用户输入的是字符还是字符串.
分别是 addParameter 函数 101, 102 行 paramName 外面添加 char(), addOptional 函数 112, 113 行 paramName 外面添加 char(), addRequired 函数 123 行添加 char().
