Обновите код для изменений R2019b в порядке приоритета функций

Начиная в R2019b, MATLAB изменяет правила для разрешения имени, влияя на порядок приоритета переменных, вложенных функций, локальных функций и внешних функций. Новые правила упрощают и стандартизируют разрешение имени. Для получения дополнительной информации смотрите Порядок приоритета функций.

Эти изменения влияют на поведение import функция. Необходимо анализировать и возможно обновить код. Чтобы запуститься, ищите свой код операторов импорта. Например, используйте, Находят, что Файлы и Папки ищут .m и .mlx файлы, содержащие текст import. Обратитесь к этим результатам поиска при оценке эффектов следующих изменений.

Идентификаторы не могут использоваться в двух целях в функции

Начиная в R2019b, ошибка заканчивается, если вы используете идентификатор, сначала как локальная или импортированная функция, и затем как переменная. В предыдущих релизах идентификатор мог использоваться в различных целях в рамках функции, которая привела к неоднозначному коду.

Если это изменение поведения влияет на ваш код, переименуйте или переменную или функцию так, чтобы у них были различные имена.

Запуск в R2019bОбновленный кодR2019a и ранее

Имя local используется в качестве local функционируйте и затем переменная. Это ошибки в коде.

function myfunc
% local is an undefined variable
local(1); % Errors
local = 2; 
disp(local);
end

function local(x)
disp(x)
end

Переименуйте функциональный local к localFcn.

function myfunc
localFcn(1);
local = 2; 
disp(local);
end

function localFcn(x)
disp(x)
end

Этот код отображает 1 затем 2.

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.

Запуск в R2019bR2019a и ранее
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

Вызывать функциональный nest от import оператор, переименуйте локальную функцию myfunc/nest.

function myfunc
import pkg.nest 
nest();          

    function newNest
    end
end

Этот вызовы функции функционируют nest от import оператор.

function myfunc
import pkg.nest   
nest();  % Calls pkg.nest

    function nest
    end
end

Этот функциональные ошибки, потому что, объявляя переменную с тем же именем как импортированный функциональный nest не поддержан.

function myvarfunc
import pkg.nest  % Errors 
nest = 1
end

Переименуйте переменную nest.

function myvarfunc
import pkg.nest  % Errors 
thisNest = 1
end

Эта функция изменяет переменную nest.

function myvarfunc
import pkg.nest
nest = 1  % Modifies variable nest and
          % displays warning since R2018a
end

Полностью определенная тень импорта внешние определения осциллографа того же имени

Запуск в R2019b, полностью определенный импорт всегда теневые внешние определения осциллографа того же имени. В R2019a и ранее, полностью определенный импорт был проигнорирован когда это затененный идентификатор во внешнем осциллографе.

Запуск в R2019bОбновленный кодR2019a и ранее

Локальная функция nest вызовы функционируют x от импортированного пакета.

function myfunc
x = 1;

    function nest
        % Import function x
        import pkg1.x 
        % Calls pkg1.x 
        x()
    end
end

Использовать переменную x в локальной функции nest, передайте переменную в качестве аргумента.

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

В этом коде функционируйте nest игнорирует импортированный функциональный x.

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 с -nojvm опция.

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

Удалите вызов usejava.

function myfunc 
import java.lang.String % Errors
% Do something with java String class 
end

Этот код отображает сообщение когда стартовый MATLAB с -nojvm опция.

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 и ранее, вложенные функции не наследовали операторов импорта от своих родительских функций.

Запуск в R2019bR2019a и ранее
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, анонимные функции могут включать и разрешенные и неразрешенные идентификаторы. В предыдущих релизах, если какие-либо идентификаторы в анонимной функции не были разрешены во время создания, были не разрешены все идентификаторы в той анонимной функции.

Запуск в R2019bR2019a и ранее

Чтобы выполнить анонимную функцию, MATLAB вызывает локальную функцию lf с x заданный в myscript потому что lf в анонимной функции решает к локальной функции.

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 рассматривает lf как неразрешенный идентификатор наряду с x, и используемый x индексировать в переменную lf от myscript.

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 

Смотрите также

Похожие темы