我正在为以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(varargin{:})

换句话说,将varargin扩展到以逗号分隔的列表中,以调用inner。然后,您可以避免所有困惑情况。

10-06 08:41