В этом разделе описываются особые факторы по использованию varargin
, varargout
, nargin
, и nargout
с вложенными функциями.
varargin
и varargout
позволяет вам создавать функции, которые принимают переменные числа входа или выходных аргументов. Хотя varargin
и varargout
выглядят как имена функции, они ссылаются на переменные, а не на функции. Это важно, потому что вложенные функции совместно используют рабочие области функций, которые их содержат.
Если вы не используете varargin
или varargout
в объявлении вложенной функции, затем varargin
или varargout
внутри вложенной функции ссылается на аргументы внешней функции.
Например, создайте функцию в файле с именем showArgs.m
который использует varargin
и имеет две вложенные функции, одна, которая использует 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
Вызовите функцию и сравните содержимое 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