Начиная в 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 как переменная, полученная из скрипта, объявите его прежде, чем вызвать скрипт. Это новое поведение также применяется, если переменная неявно введена функциями simevalevalc, и 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 |