Как передать пропущенный аргумент в следующую функцию? - PullRequest
0 голосов
/ 21 мая 2018

В Matlab я могу опустить аргументы функции, например,

function res = caller(a, b)
...

Я могу вызвать ее с помощью

caller(12)

Но как я могу передать этот отсутствующий аргумент, например,:

function res = caller(a, b)
   callee(a, b)
   ...

Как я могу сделать так, что если caller вызывается без аргумента secong, то callee также вызывается без второго аргумента?

UPDATE

Предположим, у вас есть много функций, вызывающих друг друга

function res = caller01(a, b)
    ...

function res = caller02(a, b)
    ...

function res = caller03(a, b)
    ...

function res = caller04(a, b)
    ...

, и вы хотите

1) сделать аргумент b необязательным

2) сделать это возможнымчтобы делегировать значение по умолчанию для вызываемого абонента

Насколько я понял, Matlab здесь неполон и требует, чтобы я включил каждый вызов вызываемого абонента в этот эшафот:

if exist('b', 'var')
   callee(a, b);
else
   callee(a);
end

, и это должно повторяться в каждомвызывающий.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я обычно делаю простой блок if, насколько мне известно, это неизбежно, если вы хотите сохранить свою функцию caller(a,b) в предоставленной форме.

Что-то гибкое, что я часто использую:

function res = caller(a, b)
  if exist('b','var')
    callee(a,b)
  else
    callee(a)
  end
end

в качестве альтернативы вы можете использовать varargin и 'pipe' независимо от того, какие аргументы пришли, непосредственно в callee, как уже упоминалось Cris, и обрабатывать любой varargin, находящийся внутри вызываемого абонента.

function res = caller(varargin)
  callee(varargin{:})
end
0 голосов
/ 21 мая 2018

Здесь есть разные опции.

Опция 1

function res = caller(varargin)
   callee(varargin{:})
   ...

Здесь мы фиксируем все входные аргументы в varargin и передаем их без проверки в callee.

Вариант 2

function res = caller(a, b)
   if nargin == 0
      callee()
   elseif nargin == 1
      callee(a)
   else if nargin == 2
      callee(a, b)
   end
   ...

Здесь мы проверяем количество входных аргументов и вызываем callee с аргументами, которые нам были переданы.

Опция 3

function res = caller(a, b)
   if nargin<1
      a = rand(10);
   end
   if nargin<2
      b = 'default value';
   end
   callee(a, b)
   ...

Здесь мы проверяем входные аргументы и используем значения по умолчанию для неуказанных входных аргументов.


Редактировать: Здесь можно также сделать гибрид.Скажите a - обязательный аргумент, а b - необязательный.Мы позволяем MATLAB обрабатывать требуемый аргумент (он автоматически генерирует соответствующие сообщения об ошибках, если он не предоставлен) и помещаем b в varargin, который мы можем использовать для вызова callee с тем же количеством входных аргументов, которые мы получили, итакже распакуйте, чтобы сгенерировать локальные переменные, которые нам нужны для дальнейшей обработки:

function res = caller(a,varargin)
   callee(a,varargin{:})
   if numel(varargin)>=1
      b = varargin{1};
   end
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...