Совместное использование данных между рабочими областями

Введение

В этом разделе показано, как совместно использовать переменные между рабочими областями или разрешить их сохранение между выполнениями функции.

В большинстве случаев переменные, созданные в функции, являются локальными переменными, известными только в этой функции. Локальные переменные недоступны в командной строке или в любой другой функции. Однако существует несколько способов обмена данными между функциями или рабочими областями.

Лучшая практика: передача аргументов

Самый безопасный способ расширить область видимости переменной функции - использовать входной параметр функции и выходные аргументы, которые позволяют вам передавать значения переменных.

Например, создайте две функции, update1 и update2, которые совместно используют и изменяют вход значение. update2 может быть локальной функцией в файле update1.m, или может быть функцией в собственном файле, update2.m.

function y1 = update1(x1)
   y1 = 1 + update2(x1);

function y2 = update2(x2)
   y2 = 2 * x2;

Вызовите update1 функцию из командной строки и назначить переменной Y в базовом рабочем пространстве:

X = [1,2,3];
Y = update1(X)
Y =
     3     5     7

Вложенные функции

Вложенная функция имеет доступ к рабочим областям всех функций, в которых она вложена. Так, например, вложенная функция может использовать переменную (в данном случае x), который определяется в его родительской функции:

function primaryFx
   x = 1;
   nestedFx

   function nestedFx
      x = x + 1;
   end
end

Когда родительские функции не используют заданную переменную, переменная остается локальной для вложенной функции. Например, в этой версии primaryFxдве вложенные функции имеют свои версии x который не может взаимодействовать друг с другом.

function primaryFx
   nestedFx1
   nestedFx2

   function nestedFx1
      x = 1;
   end

   function nestedFx2
      x = 2;
   end
end

Для получения дополнительной информации см. Раздел «Вложенные функции».

Постоянные переменные

Когда вы объявляете переменную в функции как постоянную, переменная сохраняет свое значение от одного вызова функции к следующему. Другие локальные переменные сохраняют свое значение только во время текущего выполнения функции. Постоянные переменные эквивалентны статическим переменным в других языках программирования.

Объявите переменные, используя persistent ключевое слово перед использованием. MATLAB® инициализирует постоянные переменные в пустую матрицу, [].

Например, задайте функцию в файле с именем findSum.m который инициализирует сумму в 0, а затем добавляет к значению на каждой итерации.

function findSum(inputvalue)
persistent SUM_X

if isempty(SUM_X)
   SUM_X = 0;
end
SUM_X = SUM_X + inputvalue;

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

Эти операции очищают постоянные переменные для функции:

  • clear all

  • очистить functionname

  • Редактирование файла функции

Чтобы предотвратить очистку стойких переменных, заблокируйте файл функции с помощью mlock.

Глобальные переменные

Глобальными переменными являются переменные, к которым можно получить доступ из функций или из командной строки. У них есть собственное рабочее пространство, которое отделено от базовых и функциональных рабочих областей.

Однако глобальные переменные несут заметные риски. Для примера:

  • Любая функция может получить доступ и обновить глобальную переменную. Другие функции, которые используют переменную, могут вернуть неожиданные результаты.

  • Если вы непреднамеренно присвоите «новой» глобальной переменной то же имя что и существующей глобальной переменной, одна функция может перезаписать значения, ожидаемые другой. Эту ошибку трудно диагностировать.

Используйте глобальные переменные скупо, если вообще.

Если вы используете глобальные переменные, объявите их с помощью global ключевое слово перед получением доступа к ним в любом конкретном местоположении (функция или командная строка). Например, создайте функцию в файле с именем falling.m:

function h = falling(t)
   global GRAVITY
   h = 1/2*GRAVITY*t.^2;

Затем введите эти команды в строке приглашения:

global GRAVITY
GRAVITY = 32;
y = falling((0:.1:5)');

Два глобальных оператора делают значение, присвоенное GRAVITY в командной строке, доступной внутри функции. Однако, как более устойчивая альтернатива, переопределите функцию, чтобы принять значение как вход:

function h = falling(t,gravity)
   h = 1/2*gravity*t.^2;

Затем введите эти команды в строке приглашения:

GRAVITY = 32;
y = falling((0:.1:5)',GRAVITY);

Оценка в другой рабочей области

The evalin и assignin функции позволяют вам вычислять команды или имена переменных из векторов символов и определять, использовать ли текущее или базовое рабочее пространство.

Как и глобальные переменные, эти функции несут риски перезаписи существующих данных. Используй их скупо.

evalin и assignin иногда полезны для функций обратного вызова в графических пользовательских интерфейсах, чтобы вычислить относительно базового рабочего пространства. Например, создайте список имен переменных из базового рабочего пространства:

function listBox
figure
lb = uicontrol('Style','listbox','Position',[10 10 100 100],...
              'Callback',@update_listBox);
update_listBox(lb)

function update_listBox(src,~)
vars = evalin('base','who');
src.String = vars;

Для других приложений программирования рассмотрим передачу аргумента и методы, описанные в Альтернативных вариантах функции eval.

Похожие темы