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–2026 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/v9.4.0/Persistent-Variables.html