Main Content

入れ子関数での引数の数のチェック

このトピックでは、vararginvarargoutnargin および nargout を入れ子関数と共に使用する場合の考慮事項について説明します。

vararginvarargout を使用すると、可変長の入出力引数を受け入れる関数を作成することができます。vararginvarargout は関数名のように見えますが、これらは関数ではなく変数を指しています。複数の入れ子関数は自身を含む関数のワークスペースを共有するため、この点は重要です。

入れ子関数の宣言で varargin または varargout を使用しない場合、入れ子関数内の varargin または varargout はその外側の関数の引数を参照します。

たとえば、showArgs.m というファイルに、varargin を使用し 2 つの入れ子関数をもつ関数を作成します。この入れ子関数のうち片方では varargin を使用し、もう一方では使用しません。

function showArgs(varargin)
nested1(3,4)
nested2(5,6,7)

    function nested1(a,b)
        disp('nested1: Contents of varargin{1}')
        disp(varargin{1})
    end

    function nested2(varargin)
        disp('nested2: Contents of varargin{1}')
        disp(varargin{1})
    end

end

この関数を呼び出し、2 つの入れ子関数の varargin{1} の内容を比較します。

showArgs(0,1,2)
nested1: Contents of varargin{1}
     0

nested2: Contents of varargin{1}
     5

一方で、narginnargout は関数です。任意の関数 (入れ子関数を含む) 内で nargin または nargout を呼び出すと、その関数の引数の数が返されます。外側の関数からの nargin または nargout の値が入れ子関数に必要な場合は、その値を入れ子関数に渡します。

たとえば showNumArgs.m というファイルに、基本 (親) 関数から入れ子関数へと入力引数の個数を渡す関数を作成します。

function showNumArgs(varargin)

disp(['Number of inputs to showNumArgs: ',int2str(nargin)]);
nestedFx(nargin,2,3,4)

    function nestedFx(n,varargin)
        disp(['Number of inputs to nestedFx: ',int2str(nargin)]);
        disp(['Number of inputs to its parent: ',int2str(n)]);
    end

end

showNumArgs を呼び出し、親関数と入れ子関数の nargin の出力を比較します。

showNumArgs(0,1)
Number of inputs to showNumArgs: 2
Number of inputs to nestedFx: 4
Number of inputs to its parent: 2

参考

| | |