我正在为一个以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
有人能想到一种不那么可怕的做事方式吗?
答案 0 :(得分:10)
外部内部的调用应该是
inner(varargin{:})
换句话说,将varargin扩展为逗号分隔列表以调用inner。然后你可以避免所有的混乱。