argn Возвращает количество входных/выходных аргументов в вызове функции

## Синтаксис

               [lhs, rhs] = argn()
                lhs = argn(1)
                rhs = argn(2)

## Аргументы

lhs

  Количество ожидаемых выходных аргументов с левой стороны. Устанавливается в 1, когда выходных аргументов не ожидается.

rhs

  Количество входных аргументов с правой стороны, указываемых при вызове функции.

## Описание

Эта функция используется внутри определения функции. Она даёт количество фактических входных аргументов (`rhs`) и выходных аргументов (`lhs`), переданных в функцию при её вызове. Она обычно используется в определениях функции для работы с необязательными аргументами.

Проверка существования именного входного аргумента с помощью `isdef(..,"l")` более надёжна, чем с помощью `argn()`. Пожалуйста, смотрите примеры.

## Примеры

Простые примеры:

    function [res, res2] = test(a, b)
      [lhs, rhs] = argn()
      [res, res2] = ("abc", %pi);
      disp([lhs rhs])  // <<<<<<<<<<<
    endfunction

    test();
    test(4.321);
    test(3, -1);
    test(3, -1, a=0);
    test(3, -1, c=8);

    out1 = test();
    [o1, o2] = test(%pi);

    --> test();
       1.   0.

    --> test(4.321);
       1.   1.

    --> test(3, -1);
       1.   2.

    --> test(3, -1, a=0);
    Неверное число аргументов.

    --> test(3, -1, c=8);
    Неверное число аргументов.

    --> out1 = test();
       1.   0.

    --> [o1, o2] = test(%pi);
       2.   1.

С использованием varargin и varargout:

    function [res, varargout] = test(a, varargin)
      res = "abc";
      varargout = list(%i);
      [lhs, rhs] = argn()
      disp([lhs rhs])  // <<<<<<<<<<<
    endfunction

    test();
    test(4.321);
    test(3, -1);
    test(3, -1, a=0);
    test(3, -1, 8);

    out1 = test();
    [o1, o2] = test(%pi);
    [o1, o2, o3] = test(%pi);

    --> test();
       1.   0.

    --> test(4.321);
       1.   1.

    --> test(3, -1);
       1.   2.

    --> test(3, -1, a=0);
       1.   3.

    --> test(3, -1, 8);
       1.   3.

    --> out1 = test();
       1.   0.

    --> [o1, o2] = test(%pi);
       2.   1.

    --> [o1, o2, o3] = test(%pi);
       3.   1.

Надёжная проверка существования входных аргументов:

    function res = test(a, b, varargin)
        res = ""
        if isdef("a","l")
            res = "a передана."
        end
        if isdef("b","l")
            res = res + " b передана."
        end
        if isdef("c","l")
            res = res + " c передана."
        end
    endfunction
    clc
    test()
    test(4.321)
    test(4.321, %z)
    test(b=3)
    test(c=3)
    test(-1, c=3)
    test(-1, a=2, c=3)
    test(b=-1, a=2, c=3)

    --> test()
     ans  =

    --> test(4.321)
     ans  =
     a передана.

    --> test(4.321, %z)
     ans  =
     a передана. b передана.

    --> test(b=3)
     ans  =
      b передана.

    --> test(c=3)
     ans  =
      c передана.

    --> test(-1, c=3)
     ans  =
     a передана. c передана.

    --> test(-1, a=2, c=3) // входные аргументы в varargin являются/становятся всегда безымянными
     ans  =
     a передана.

    --> test(b=-1, a=2, c=3)
     ans  =
     a передана. b передана.

Другое использование:

    function concat = myOwnFunction(name,optional)
      [lhs,rhs] = argn()
      if rhs <= 1 then
         optional="моё Необязательное значение"
      end
      if rhs == 0 then
         error("Ожидался по меньшей мере один аргумент")
      end
      concat = name+" "+optional
    endfunction

## Смотрите также

- isdef
- varargin
- varargout
- macrovar
- function