Рабочие области для вложенных и анонимных функций являются статическими. Это означает, что все переменные, используемые в функции, должны присутствовать в тексте кода.
При попытке динамически добавить переменную в статическую рабочую область анонимной функции, вложенной функции или функции, которая содержит вложенную функцию, то MATLAB® выдает ошибку формы
Attempt to add variable to a static workspace.
Для получения дополнительной информации о различиях между основными и функциональными рабочими областями, смотрите Основные и Функциональные Рабочие области. Для получения дополнительной информации о вложенных функциях, смотрите Вложенные функции.
Один способ постараться не динамически добавлять переменную в статические рабочие области состоит в том, чтобы явным образом объявить переменную в коде прежде динамически присвоить значение той переменной. Выполнение так заставит имя переменной отображаться к MATLAB, таким образом, имя будет включено в фиксированный набор переменных, которые составляют статическую рабочую область.
Например, предположите скрипт под названием makeX.m
динамически присваивает значение переменной X
. Функция, которая вызывает makeX
и явным образом объявляет X
избегает динамической ошибки добавления потому что X
находится в функциональной рабочей области.
Распространенный способ объявить переменную состоит в том, чтобы инициализировать свое значение как пустой массив:
function noerror nestedfx function nestedfx X = []; makeX end end
eval
evalin
, или assignin
присваивать новые переменные во вложенной функцииИспользуя eval
evalin
, или assignin
чтобы присвоить новые переменные в, вложенные функции сгенерируют ошибку.
function staticWorkspaceErrors function nest % This will error since x is not declared outside of the eval eval("x=2"); end end
Если возможно, избегайте этих функций в целом. См. Альтернативные варианты функции eval. Если не возможно избежать их, то явным образом объявляют переменную в родительской функции:
function noStaticWorkspaceErrors x = []; function nest % This will not error since 'x' is declared outside of the eval eval("x=2"); end end
Вызов скрипта MATLAB, который создает переменную во вложенной функции, сгенерирует ошибку. В примере ниже, скрипт, scriptThatIntroducesZ
, содержит код, который присваивает значение переменной z
. Поскольку код явным образом не объявляет тот z
присваивается ошибка будет выдана.
function staticWorkspaceErrors function nest % This will error since 'z' is not declared outside of this script scriptThatIntroducesZ end end
Чтобы избежать ошибки, объявите переменную в функции прежде, чем вызвать скрипт, который присваивает значение ему.
function noStaticWorkspaceErrors function nest % This will not error since 'z' is declared outside of the script z = []; scriptThatIntroducesZ end end
В качестве альтернативы преобразуйте скрипт в функцию и сделайте z
это - выходной аргумент. Этот подход также делает код более ясным.
load
ФункцияИспользуя load
присваивать переменные во вложенной функции, явным образом не задавая имя переменной сгенерирует ошибку. В примере ниже, load
использоваться, чтобы загрузить MAT-файл, содержащий переменную Y
. Поскольку код явным образом не объявляет тот Y
присваивается ошибка будет выдана.
function staticWorkspaceErrors function nest % This will error since var Y is not explicitly specified load MatFileWithVarY end end
Чтобы избежать ошибки, вместо этого задайте имя переменной как вход к load
функция.
function noStaticWorkspaceErrors function nest % This will not error since variables 'x' and 'y' are specified load MatFileWithVarX x y = load('MatFileWithVarY','y'); end end
В качестве альтернативы присвойте выход от load
функционируйте к массиву структур.
При отладке вы не можете добавить переменную с помощью подсказки команды отладки, если вы останавливаетесь во вложенной функции. Присвойте переменную в базовое рабочее пространство, которое не является статическим.
K>> assignin('base','X',myvalue)
Анонимные функции не могут содержать переменные присвоения. Когда анонимная функция будет вызвана, ошибка будет выдана.
% This will error since 'x' is being assigned inside % the anonymous function @()eval("x=2")
Перепишите функцию таким способом, которым не требуются переменные присвоения.
xEquals2 = @()2; x = xEquals2()
x = 2