я написал функцию тестирования, и побежал в неприятности с inputParser
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
Если я бегу
doit('hello','color','g')
или
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.
Похоже, я не понимая, что последний аргумент, анонимная функция, которая должна подтвердить ввод аргумент. В чем проблема?
редактировать:
Matlab 2015a на Win7.
редактировать 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
Есть как минимум две вещи, которые могут привести к сбою анализа(). Во-первых: это:
>> 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.
Обратите внимание, что даже если Optional «форма» должна быть проверена на числовой, анализатор появляется думать «Ноно» является началом пары имя-значение.
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{:}
с списком параметров (необязательная или пара имя-значение). Из-за несогласованных сбоев, я не могу настроить ситуацию с необязательным аргументом char, за которым следует пара имен и значений, насколько я могу видеть.
обновление
Я подал отчет об ошибке в MathWorks, «Техническая поддержка Case # 02121531», и они были в состоянии воспроизвести проблему.
что делать, если вы повторяете x в анонимном fcn? 'p.addOptional ('shape', 'forget', @ (x) ischar (x))' – Trogdor
, какую версию Matlab вы используете? – Trogdor
Он также выглядит как inputParser имеет проблемы с смешиванием addOptional и addParameter. В этом примере addOptional кажется обязательным 1-м входным аргументом (в 2015b) – Trogdor