Осуществляйте обмен данными между рабочими областями

Введение

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

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

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

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

Например, создайте две функции, 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);

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

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.

Похожие темы