Я пишу обертку в функцию, которая берет 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
Кто-либо может думать о менее отвратительном способе сделать вещи?
Вместо этого вызов inner в outer должен быть
inner(varargin{:})
Другими словами, разверните varargin в список, разделенный запятыми, для вызова inner. Тогда вы сможете избежать всей этой неразберихи.