入れ子関数での引数の数のチェック
このトピックでは、varargin
、varargout
、nargin
および nargout
を入れ子関数と共に使用する場合の考慮事項について説明します。
varargin
と varargout
を使用すると、可変長の入出力引数を受け入れる関数を作成することができます。varargin
と varargout
は関数名のように見えますが、これらは関数ではなく変数を指しています。複数の入れ子関数は自身を含む関数のワークスペースを共有するため、この点は重要です。
入れ子関数の宣言で 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
一方で、nargin
と nargout
は関数です。任意の関数 (入れ子関数を含む) 内で 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