7.2 Переменные, сохраняющие значение
Переменная, объявленная как сохраняющая значение (persistent) внутри функции, сохраняет свое содержимое в памяти между последующими вызовами этой функции. Отличие от глобальных переменных заключается в том, что переменные, сохраняющие значение, имеют локальную область видимости внутри конкретной функции и не видны в других частях программы.
Следующий пример использует переменную, сохраняющую значение, для создания функции, которая выводит количество раз, когда она была вызвана.
function count_calls ()
persistent calls = 0;
printf ("'count_calls' has been called %d times\n",
++calls);
endfunction
for i = 1:3
count_calls ();
endfor
-| 'count_calls' has been called 1 times
-| 'count_calls' has been called 2 times
-| 'count_calls' has been called 3 times Как показывает пример, переменная может быть объявлена как сохраняющая значение с помощью инструкции объявления persistent. Следующие инструкции — это объявления сохраняющих значение переменных.
persistent a persistent a b persistent c = 2 persistent d = 3 e f = 5
Поведение переменных, сохраняющих значение, эквивалентно поведению статических переменных в языке C.
Существует ограничение для переменных, сохраняющих значение: входные и выходные аргументы функции не могут быть переменными, сохраняющими значение:
function y = foo () persistent y = 0; # Not allowed! endfunction foo () -| error: can't make function parameter y persistent
Как и глобальные переменные, переменная, сохраняющая значение, может быть инициализирована только один раз. Например, после выполнения следующего кода
persistent pvar = 1 persistent pvar = 2
значение переменной, сохраняющей значение, pvar равно 1, а не 2.
Если переменная, сохраняющая значение, объявлена, но не инициализирована конкретным значением, она будет содержать пустую матрицу. Поэтому инициализировать переменную, сохраняющую значение, можно также, проверив, пуста ли она, как показано в следующем примере.
function count_calls ()
persistent calls;
if (isempty (calls))
calls = 0;
endif
printf ("'count_calls' has been called %d times\n",
++calls);
endfunction Эта реализация ведет себя точно так же, как предыдущая реализация count_calls.
Значение переменной, сохраняющей значение, хранится в памяти до тех пор, пока оно не будет явно очищено. Предположим, что реализация count_calls сохранена на диске, и мы получим следующее поведение.
for i = 1:2 count_calls (); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times clear for i = 1:2 count_calls (); endfor -| 'count_calls' has been called 3 times -| 'count_calls' has been called 4 times clear all for i = 1:2 count_calls (); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times clear count_calls for i = 1:2 count_calls (); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times
То есть переменная, сохраняющая значение, удаляется из памяти только тогда, когда удаляется содержащая её функция. Обратите внимание, что если определение функции вводится непосредственно в командную строку Octave, переменная, сохраняющая значение, будет очищена простой командой clear, так как всё определение функции будет удалено из памяти. Если вы не хотите, чтобы переменная, сохраняющая значение, удалялась из памяти даже при удалении функции, используйте функцию mlock (см. Блокирование функций).
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Persistent-Variables.html