Распаковка varargin для отдельных переменных - PullRequest
5 голосов
/ 19 марта 2010

Я пишу оболочку для функции, которая принимает varargin в качестве входных данных. Я хочу сохранить сигнатуру функции в оболочке, но при вложении varargin все переменные объединяются.

function inner(varargin) %#ok<VANUS>
% An existing function
disp(nargin)
end

function outer(varargin)
% My wrapper
inner(varargin);
end

outer('foo', 1:3, {})   % Uh-oh, this is 1

Мне нужен способ распаковать varargin во внешней функции, чтобы у меня был список отдельных переменных. Есть очень неприятный способ сделать это, создав строку имен переменных для передачи inner и вызвав eval.

function outer2(varargin) %#ok<VANUS>
% My wrapper, second attempt
inputstr = '';
for i = 1:nargin
   inputstr = [inputstr 'varargin{' num2str(i) '}']; %#ok<AGROW>
   if i < nargin
      inputstr = [inputstr ', ']; %#ok<AGROW>
   end
end    
eval(['inner(' inputstr ')']);
end

outer2('foo', 1:3, {})   % 3, as it should be

Кто-нибудь может подумать о менее отвратительном способе ведения дел, пожалуйста?

1 Ответ

10 голосов
/ 19 марта 2010

Вместо этого вызов во внутреннем во внешнем должен быть

inner(varargin{:})

Другими словами, разверните varargin в список через запятую для вызова inner. Тогда вы можете избежать всего беспорядка.

...