代码之家  ›  专栏  ›  技术社区  ›  Richie Cotton Joris Meys

将varargin解包到单个变量

  •  5
  • Richie Cotton Joris Meys  · 技术社区  · 15 年前

    我正在为一个函数编写一个包装器,该函数将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
    

    我需要一个开箱的方法 瓦拉金 在外部函数中,我有一个单独变量的列表。有一种非常糟糕的方法可以做到这一点,即构造一个变量名的字符串来传递 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 回复  |  直到 13 年前
        1
  •  10
  •   Loren    14 年前

    内部调用在外部应改为

    inner(varargin{:})
    

    换句话说,将varargin扩展到逗号分隔的列表中,以便调用inner。然后你就可以避免所有的混乱。