Начиная в R2019b, MATLAB изменяет правила для разрешения имени, влияя на порядок приоритета переменных, вложенных функций, локальных функций и внешних функций. Новые правила упрощают и стандартизируют разрешение имени. Для получения дополнительной информации смотрите Порядок приоритета функций.
Эти изменения влияют на поведение import
функция. Необходимо анализировать и возможно обновить код. Чтобы запуститься, ищите свой код операторов импорта. Например, используйте, Находят, что Файлы и Папки ищут .m
и .mlx
файлы, содержащие текст import
. Обратитесь к этим результатам поиска при оценке эффектов следующих изменений.
Начиная в R2019b, ошибка заканчивается, если вы используете идентификатор, сначала как локальная или импортированная функция, и затем как переменная. В предыдущих релизах идентификатор мог использоваться в различных целях в рамках функции, которая привела к неоднозначному коду.
Если это изменение поведения влияет на ваш код, переименуйте или переменную или функцию так, чтобы у них были различные имена.
Запуск в R2019b | Обновленный код | R2019a и ранее |
---|---|---|
Имя function myfunc % local is an undefined variable local(1); % Errors local = 2; disp(local); end function local(x) disp(x) end | Переименуйте функциональный function myfunc localFcn(1); local = 2; disp(local); end function localFcn(x) disp(x) end | Этот код отображает function myfunc local(1); % local is a function local = 2; disp(local); end function local(x) disp(x) end |
Начиная в R2019b, MATLAB® не использует операторы индексирования, чтобы идентифицировать переменные в вашей программе. Ранее идентификатор без явного объявления был обработан как переменная, когда он был индексирован с двоеточием, end
, или фигурные скобки. Например, x
был обработан как переменная в x(a,b,:)
, x(end)
, и x{a}
.
Рассмотрите следующий код. MATLAB раньше обрабатывал x
как переменная из-за индексации двоеточия. Начиная в R2019b, если функция того же имени существует на пути, MATLAB обрабатывает x
как функция.
function myfunc load data.mat; % data.mat contains variable x disp(x(:)) end
Если вы намереваетесь использовать x
как переменная из data.mat
вместо функции явным образом объявите его. Точно так же использовать идентификатор x
как переменная, полученная из скрипта, объявите его прежде, чем вызвать скрипт. Это новое поведение также применяется, если переменная неявно введена функциями sim
eval
evalc
, и assignin
.
Эта таблица показывает некоторые примеры того, как можно обновить код.
Прежде | После |
---|---|
function myfunc load data.mat; disp(x(:)) end | function myfunc load data.mat x; disp(x(:)) end |
function myfunc2 myscript; % Contains variable x disp(x(:)) end | function myfunc2 x = []; myscript; disp(x(:)) end |
Запуск в R2019b, совместное использование идентификатора как переменная между вложенной функцией и ее родительской функцией возможны, только если идентификатор явным образом объявляется как переменная в родительской функции.
Например, в следующем коде, идентификатор x
в myfunc
отличается от переменной x
во вложенной функции. Если x
функция на пути, MATLAB обрабатывает x
в myfunc
как функция и запуски кода. В противном случае MATLAB выдает ошибку.
function myfunc nested; x(3) % x is not a shared variable function nested x = [1 2 3]; end end
В предыдущих релизах, если x
была функция на пути, MATLAB обработал его как функцию в myfunc
и как переменная в nested
. Если x
не была функция на пути, MATLAB обработал его как переменную, совместно использованную myfunc
и nested
. Это привело к коду, выход которого зависел от состояния пути.
Чтобы использовать идентификатор в качестве, переменная совместно использовала между родительскими и вложенными функциями, вы можете должны быть обновить свой код. Например, можно инициализировать идентификатор к пустому массиву в родительской функции.
Прежде | После |
---|---|
function myfunc nested; x(3) function nested x = [1 2 3]; end end | function myfunc x = []; nested; x(3) function nested x = [1 2 3]; end end |
Начиная в R2019b, импортированные функции от основанного на подстановочном знаке импорта имеют более низкий приоритет, чем переменные, вложенные функции и локальные функции. В R2019a и ранее, импорт в функции затененные локальные функции и вложенные функции.
Например, в этом коде, операторе local()
вызовы myfunc/local
вместо pkg1.local
в основанном на подстановочном знаке импорте. Оператор nest()
вызовы myfunc/nest
вместо pkg1.nest
.
Запуск в R2019b | R2019a и ранее |
---|---|
function myfunc % Import includes functions local and nest import pkg1.* local() % Calls myfunc/local function nest end nest(); % Calls myfunc/nest end function local end |
function myfunc % Import includes functions local and nest import pkg1.* local() % Calls pkg1.local and % displays warning since R2018a function nest end nest(); % Calls pkg1.nest end function local end |
В результатах поиска для import
, ищите операторы, которые включают подстановочный символ (*
).
При запуске в R2019b полностью определенный импорт, который совместно использует имя с вложенной функцией в том же осциллографе, выдает ошибку.
Запуск в R2019b | Обновленный код | R2019a и ранее |
---|---|---|
Этот функциональные ошибки, потому что это совместно использует имя с вложенной функцией в том же осциллографе. function myfunc import pkg.nest % Errors nest(); function nest end end | Вызывать функциональный function myfunc import pkg.nest nest(); function newNest end end | Этот вызовы функции функционируют function myfunc import pkg.nest nest(); % Calls pkg.nest function nest end end |
Этот функциональные ошибки, потому что, объявляя переменную с тем же именем как импортированный функциональный function myvarfunc import pkg.nest % Errors nest = 1 end | Переименуйте переменную function myvarfunc import pkg.nest % Errors thisNest = 1 end | Эта функция изменяет переменную function myvarfunc import pkg.nest nest = 1 % Modifies variable nest and % displays warning since R2018a end |
Запуск в R2019b, полностью определенный импорт всегда теневые внешние определения осциллографа того же имени. В R2019a и ранее, полностью определенный импорт был проигнорирован когда это затененный идентификатор во внешнем осциллографе.
Запуск в R2019b | Обновленный код | R2019a и ранее |
---|---|---|
Локальная функция function myfunc x = 1; function nest % Import function x import pkg1.x % Calls pkg1.x x() end end | Использовать переменную function myfunc x = 1; nest(x) function nest(x1) % Import function x import pkg1.x % Calls pkg1.x with % variable x1 x(x1) end end | В этом коде функционируйте function myfunc x = 1; function nest % Import function x import pkg1.x % x is a variable x() end end |
При запуске в R2019b полностью определенный импорт, который не может быть разрешен, выдает ошибку с или без Java®. В R2019a и ранее, MATLAB вел себя по-другому в зависимости от того, начали ли вы MATLAB с -nojvm
опция. Не используйте функции как javachk
и usejava
настроить сообщения об ошибке.
Запуск в R2019b | Обновленный код | R2019a и ранее |
---|---|---|
Этот код выдает ошибку когда стартовый MATLAB с function myfunc import java.lang.String % Errors if ~usejava('jvm') % Statement never executes disp('This function requires Java'); else % Do something with Java String class end end | Удалите вызов function myfunc import java.lang.String % Errors % Do something with java String class end | Этот код отображает сообщение когда стартовый MATLAB с function myfunc import java.lang.String if ~usejava('jvm') % Display message disp('This function requires Java'); else % Do something with Java String class end end |
Начиная в R2019b, вложенные функции наследовали import
операторы от родительской функции. В R2019a и ранее, вложенные функции не наследовали операторов импорта от своих родительских функций.
Запуск в R2019b | R2019a и ранее |
---|---|
function myfunc % Package p1 has functions plot and bar import p1.plot import p1.* nest function nest plot % Calls p1.plot bar % Calls p1.bar end end |
function myfunc % Package p1 has functions plot and bar import p1.plot import p1.* nest function nest plot % Calls plot function on path bar % Calls bar function on path end end |
Начиная в R2019b, MATLAB разрешает составные имена по-другому. Составное имя состоит из нескольких частей, к которым соединяет точка (например, a.b.c
), который может использоваться к ссылочным членам пакета. С R2019b MATLAB разрешает составные имена путем предоставления приоритета самому длинному префиксу соответствия. В предыдущих релизах порядок приоритета следовал за более комплексным рядом правил.
Например, предположите пакет pkg
содержит класс foo
со статическим методом bar
и также подпакет foo
с функциональным bar
.
+pkg/@foo/bar.m % bar is a static method of class foo +pkg/+foo/bar.m % bar is a function in subpackage foo
В R2019b, вызове which pkg.foo.bar
возвращает путь к функции пакета.
which pkg.foo.bar
+pkg/+foo/bar.m
Ранее статический метод был более приоритетен по сравнению с функцией пакета в случаях, где пакет и класс имели то же имя.
Начиная в R2019b, анонимные функции могут включать и разрешенные и неразрешенные идентификаторы. В предыдущих релизах, если какие-либо идентификаторы в анонимной функции не были разрешены во время создания, были не разрешены все идентификаторы в той анонимной функции.
Запуск в R2019b | R2019a и ранее |
---|---|
Чтобы выполнить анонимную функцию, MATLAB вызывает локальную функцию function myfun myscript; % Includes x = 1 and lf = 10 f = @()lf(x); f() % Displays 'Inside lf' end % Local function to myfun function lf(y) disp('Inside lf'); end | MATLAB рассматривает function myfun myscript; % Includes x = 1 and lf = 10 f = @()lf(x); f() % Displays 10 end % Local function to myfun function lf(y) disp('Inside lf'); end |